【问题标题】:Issue making method run at application launch问题制作方法在应用程序启动时运行
【发布时间】:2014-04-23 22:25:22
【问题描述】:

我正在开发一个将相机用于各种不同目的的应用。现在,当我启动应用程序时,我正在努力让一些代码运行:

UIImagePickerController *imageView = [[UIImagePickerController alloc]init];
imageView.delegate = self;
imageView.sourceType = UIImagePickerControllerSourceTypeCamera;
imageView.showsCameraControls = NO;

[self presentViewController:imageView animated:YES completion:NULL];

我需要在启动时对imageView UIView 对象执行此操作,因此当应用程序打开时,它会直接转到UIImagePickerController。这是我的应用程序的所有代码:

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

- (void)applicationDidBecomeActive
{

    UIImagePickerController *imageView = [[UIImagePickerController alloc]init];
    imageView.delegate = self;
    imageView.sourceType = UIImagePickerControllerSourceTypeCamera;
    imageView.showsCameraControls = NO;

    [self presentViewController:imageView animated:YES completion:NULL];


}

@end

【问题讨论】:

  • 真正的问题是什么?您发布的代码在哪里?
  • 我编辑了我的帖子,希望它更清楚一点。

标签: ios objective-c cocoa-touch camera


【解决方案1】:

如果你想在任何控制器中得到通知,你应该监听UIApplicationDidBecomeActiveNotificationsimilar notifications

- (void)viewDidLoad
{
    [super viewDidLoad];
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(applicationDidBecomeActive)
                                                 name:UIApplicationDidBecomeActiveNotification 
                                               object:nil];
}

要注销,做

[[NSNotificationCenter defaultCenter] removeObserver:self 
                                                name:UIApplicationDidBecomeActiveNotification
                                              object:nil];

dealloc 或您不想再收到通知时。


如果你使用故事板,你的应用代理应该是这样的

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // Override point for customization after application launch.
    return YES;
}

//…

@end 

如果您不使用情节提要,您的应用委托可能是

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{    
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    [self.window makeKeyAndVisible];
    self.window.rootViewController = [[ViewController alloc] init];
    return YES;
}

//…

@end 

和你的视图控制器

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(applicationDidBecomeActive)
                                                 name:UIApplicationDidBecomeActiveNotification
                                               object:nil];
}

-(void)dealloc
{
    [[NSNotificationCenter defaultCenter] removeObserver:self
                                                    name:UIApplicationDidBecomeActiveNotification
                                                  object:nil];
}

- (void)applicationDidBecomeActive
{

    UIImagePickerController *imageViewPickerController = [[UIImagePickerController alloc] init];
    imageViewPickerController.sourceType = UIImagePickerControllerSourceTypeCamera;
    [self presentViewController:imageViewPickerController
                       animated:NO
                     completion:NULL];
}

@end

【讨论】:

  • 那么,我可以将我的代码应用于此吗?我不明白这如何使我能够启动 UIImagePickerController
  • 你没看到你的applicationDidBecomeActive在收到通知UIApplicationDidBecomeActiveNotification的时候被执行了吗?
  • 啊,是的。所以我将我的代码放在 AppDelegate.m 中的applicationDidBecomeActive 内?这样当UIApplicationDidBecomeActiveNotification 运行时,它会引用那个?
【解决方案2】:

如果您希望在启动应用程序时运行代码,您应该将其放入:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

如果您希望 UIImagePickerController 成为第一个显示的 viewController,您应该将其设置为窗口的 rootViewController,如下所示:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // Set up imageView here

    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    [self.window makeKeyAndVisible];
    self.window.rootViewController = imageView;
    return YES;
}

如果/当您想从另一个已经在屏幕上的 viewController 呈现它时,请使用 presentViewController。

【讨论】:

  • 感谢您的评论。我觉得这让我非常接近,但我不太明白 UIWindow 对象是什么。我给了它一个谷歌,我找不到任何简明的信息。我不太明白 viewController 和 UIWindow 之间的区别。
  • 一个应用程序只有一个窗口,但可以有多个视图控制器。当您在 Xcode 中创建项目时,它应该在 AppDelegate.m 文件中的 didFinishLaunchingWithOptions 中包含窗口代码。您只需添加设置 rootViewController 的行。您可能应该阅读一些文档:developer.apple.com/library/ios/documentation/uikit/reference/…
  • 请观看 WWDC 2011 视频“实现 UIViewController 遏制”。它解释了一点,为什么像这样更改 rootviewcontroller 是一个坏主意,实际上工程师多次警告“我向你保证,坏事会发生”。至少会发生方向问题。
  • @vikingosegundo 是的,他的回答可能不是最好的问题,但我假设你认为设置 rootViewController 是不正确的。
  • 嗯,我想我应该更清楚。我真的需要在打开应用程序时显示我的UIImagePickerController,我希望使用故事板来简化 UI 设计。我知道按钮和其他 UI 元素可以通过编程方式创建,但对于这个相机应用程序,可视化布局会更好。
猜你喜欢
  • 2021-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-18
相关资源
最近更新 更多