UIView (подпросмотр) не отправляет IBActions в AppDelegate

#iphone #cocoa-touch #uiview #uiapplicationdelegate #ibaction

#iPhone #cocoa-touch #uiview #uiapplicationdelegate #ibaction

Вопрос:

У меня возникла эта проблема, потому что изначально я создавал все в главном коде, но затем, прочитав, узнал, что лучше использовать подпросмотры.

У меня есть мои IBActions в AppDelegate, и я успешно подключился и загрузил свои вложенные просмотры. Однако, когда я пытаюсь подключить свои кнопки в вложенных представлениях к IBActions в AppDelegate, IBActions отображаются в разделе «Первый ответчик». Кажется, что они нормально подключаются, но при запуске приложения они не запускают IBActions (я подтвердил это с помощью некоторых NSLogs, это не ошибка в коде внутри IBActions). Что я делаю не так?

Спасибо!

Ответ №1:

AppDelegate следует использовать только для очень специфических элементов, таких как реализация UIApplicationDelegate протокола (т. Е. методов, подобных applicationDidFinishLaunching ) или, в некоторых случаях, для хранения глобальных переменных.

Вы должны сохранить IBActions и другие выходы в соответствующих файлах контроллера просмотра (т. Е. Если вы создали MyViewController.h и MyViewController.m, которые связаны с MyViewController.xib, где у вас есть некоторые кнопки, изображения и т.д.). Затем их можно подключить, перетащив нужный элемент управления inspector (например, touchUpInside) владельцу файла.

Кое-что, что вам следует прочитать, чтобы лучше понять контроллеры просмотра: http://developer.apple.com/iphone/library/featuredarticles/ViewControllerPGforiPhoneOS/Introduction/Introduction.html

Обычно лучше всего создать уникальный контроллер представления для каждого представления, которое вы будете предоставлять пользователю. Например, если бы у меня был главный экран, а затем экран «о программе» или настройки, я бы сделал для каждого из них свой собственный контроллер просмотра. Это помогает организовать работу лучше, чем использование одного представления с целой кучей вложенных представлений, которые вы скрываете / показываете, а также улучшит время загрузки и общую производительность.

Обновите ваш 2-й вопрос в комментариях о доступе к делегату приложения:

Во-первых, вам нужно импортировать файл .h (т. Е. #import "AppDelegate.h" ) для делегата приложения в любой файл view controller .m, который вы хотите использовать для доступа к любым переменным, массивам и т.д., Которые вы сохранили в файлах делегата приложения. Убедитесь, что вы синтезируете любые объекты, которые вы создаете в файле app delegate .h в файле app delegate .m, чтобы были созданы средства получения и установки (чтобы вы могли получить к ним доступ).

Затем в файле view controller .m, каким бы методом вы ни пользовались:

 -(void)someMethod { 
 // here we just create a shortcut to the app delegate called "theAppDelegate"
 YourAppDelegateFileNameHere *theAppDelegate = (YourAppDelegateFileNameHere *)[[UIApplication sharedApplication] delegate];

 // now you can use the dot notation if you wanna access a variable
 int SomeNewInteger = theAppDelegate.someIntegerYouHaveStored;

 // or some array you have stored
 return [theAppDelegate.someArrayYouCreated count]; 
 }
  

Надеюсь, это поможет!

Комментарии:

1. Спасибо! Как насчет доступа к объектам из AppDelegate в контроллере представления? Я объявил AppDelegate следующим образом: //Интерфейс AppDelegate AppDelegate; @property (неатомный, сохранить) AppDelegate *AppDelegate; //Реализация @synthesize AppDelegate; AppDelegate = (AppDelegate )[[Делегат общего приложения UIApplication]]; тем не менее, когда я пытаюсь что-то сделать, я всегда получаю «доступ к неизвестному методу получения». Извините, StackOverflow не позволяет мне правильно отформатировать мой комментарий.

2. Пожалуйста, смотрите мой обновленный ответ о том, как правильно его вызывать. С делегатом приложения все немного по-другому, поскольку вам не нужно настраивать свойства или синтезировать его, как вы делали (вот почему вы получаете ошибку неизвестного метода получения)

3. P.S. Если ответ полезен для вас, пожалуйста, возьмите за привычку голосовать за те ответы, которые наиболее полезны. Это вроде как похлопывание людей по спине за их помощь здесь 🙂

4. хорошо, я понял, что мне нужно использовать синтаксис стрелки (я пытался выполнить [theAppDelegate.NetworkClient SendMessage:@»whatever»]; когда на самом деле мне нужно [theAppDelegate->NetworkClient SendMessage:@»whatever»]; ). Однако теперь я не получаю ошибок при компиляции, но приложение просто вылетает… до сих пор я не мог проголосовать за. требуется такая большая репутация или что-то в этом роде. 🙂 спасибо за вашу помощь.

5. Вероятно, вам следует задать новый вопрос, поскольку это немного отклоняется от темы вашего первоначального вопроса. В вашем новом вопросе не могли бы вы подробнее объяснить, что networkClient такое? Это просто метод, который вы пытаетесь вызвать и передать переменную, или вы пытаетесь получить доступ к переменной экземпляра? Кроме того, какое сообщение об ошибке отображается в консоли (в меню «Выполнить» в XCode) после сбоя.