#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, просто чтобы убедиться, что у меня есть то, что я хочу, когда я запускаю проект. Это состояние моего пера прямо сейчас
Не внося никаких изменений в 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. щелкните и переместитесь из пустого круга в ярлык окна на боковой панели или непосредственно в окно, которое вы создали на экране.
Удачи