Окно показано, но не может взаимодействовать с симулятором

#iphone #ios #xcode #ios5 #xcode4.2

#iPhone #iOS #xcode #ios5 #xcode4.2

Вопрос:

Я читаю Programming iOS4 от O’Rielly и использую немного более новую версию XCode, чем та, которую использует книга. Однако это небольшое изменение привело к некоторой путанице, потому что я не могу создать оконное приложение, используя XCode 4.2.

В любом случае, я запустил пустой проект, который дал мне структуру barebone для приложения iPhone без MainWindow.xib. Мне уже дали делегата проекта.h и .m. Я приступил к созданию собственного MainWindow.xib. Я понял, что мне нужно было установить ‘Main nib file base name’ в ‘MainWindow’, чтобы мой nib отображался вообще, и поэтому я это сделал.

Внутри моего MainWindow.xib я добавил кнопку под объектом window, просто чтобы убедиться, что у меня есть то, что я хочу, когда я запускаю проект. Это состояние моего пера прямо сейчас

MainWindow.xib

Не внося никаких изменений в AppDelegate.h и AppDelegate.m, я создал и запустил свой проект. Я смог увидеть кнопку! ОДНАКО я не смог нажать на кнопку, и когда я нажал кнопку «Домой» и возобновил работу с пустым приложением, я больше не мог видеть кнопку! Вот некоторые файлы, в которые я не вносил никаких изменений:

main.m

 #import <UIKit/UIKit.h>

#import "EmptyWindowAppDelegate.h"

int main(int argc, char *argv[])
{
    @autoreleasepool {
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([EmptyWindowAppDelegate class]));
    }
}
  

EmptyWindowAppDelegate.m

 #import "EmptyWindowAppDelegate.h"

@implementation EmptyWindowAppDelegate

@synthesize window = _window;
@synthesize managedObjectContext = __managedObjectContext;
@synthesize managedObjectModel = __managedObjectModel;
@synthesize persistentStoreCoordinator = __persistentStoreCoordinator;

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    // Override point for customization after application launch.
    self.window.backgroundColor = [UIColor whiteColor];
    [self.window makeKeyAndVisible];
    return YES;
}
//...Omitted
  

Ответ №1:

Вы можете указать имя основного файла nib в вашем приложении plist (по умолчанию это MainWindow.xib).

Чтобы продолжить изучение вашей проблемы, вы могли бы просто создать приложение на основе просмотра по умолчанию и посмотреть, в чем заключаются различия. Мне кажется, что вы не установили никакой связи в interface Builder между свойством window вашего делегата приложения и вашим объектом IB window. Это означает, что окно в didFinishLaunchingWithOptions, вероятно, будет равно нулю, и поэтому сообщения, которые вы ему отправляете, не будут иметь никакого эффекта.

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

1. Я сделал объект window похожим на IBOutlet, и я подключил объект Window nib для ссылки на window IBOutlet и все еще не могу перейти.

2. И я сравнил свой проект с шаблонным. Единственное отличие заключается в том, что шаблонная версия имеет контроллер представления. Однако я не думаю, что требуется контроллер?

3. Я никогда не пробовал без контроллера просмотра, я не понимаю, почему ваша кнопка не отображается. Вы можете проверить подвиды Windows и супервид кнопки в коде, установить несколько обратных вызовов IBAction. В любом приложении лучше и рекомендуется иметь контроллер просмотра.

4. оно показывает. но когда я нажимаю на него, оно не становится синим. Да, я понимаю, что в реальном проекте будет рекомендован контроллер, но я просто хочу иметь возможность понять, как проект подключается с нуля.

5. Возможно, что значение interactionEnabled в окне по умолчанию равно NO.

Ответ №2:

Я думаю, проблема в этой строке в AppDelegate.m:

 self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
  

Что происходит, так это то, что при запуске приложения вы создаете новое окно с пустым белым фоном и отображаете его. Поскольку вы уже разработали окно в Interface Builder, вам не нужно делать это снова в коде. Все, что вам нужно при запуске didFinishLaunching … это:

 [self.window makeKeyAndVisible];
return YES;
  

Затем измените «@synthesize window = _window;» на просто чтение «@synthesize window;»

Следующий шаг — изменение файла AppDelegate.h. Измените свой код, чтобы он выглядел примерно так.

 @interface AppDelegate : UIResponder <UIApplicationDelegate>
{

}
@property (strong, nonatomic) UIWindow *window;
  

Теперь, что вы можете сделать в InterfaceBuilder, это связать свойство window в AppDelegate.m с окном, которое вы разработали. Как только вы создадите свойство window, оно отобразится в разделе Outlets для EmptyWindowAppDelegate. щелкните и переместитесь из пустого круга в ярлык окна на боковой панели или непосредственно в окно, которое вы создали на экране.

Удачи