【问题标题】:View Controllers and code completion查看控制器和代码完成
【发布时间】:2014-06-13 17:29:29
【问题描述】:

我的应用拍了一张照片,然后需要询问用户他们想为他们的图片命名什么。

我尝试过使用 UIAlertView,但我遇到了这个问题,即字符串本身没有按时收集,因为代码不会暂停以等待用户输入。

我现在想尝试的是制作一个新的视图控制器,它只有一个文本字段供用户输入他们的 PDF 文件名。我想知道的是它在概念上究竟是如何工作的(或者它是否会工作)。

伪代码: 1. 用户单击拍照按钮,该按钮运行捕获图像的方法。 2.图像入内存后,呈现出带有文本字段的View Controller。 3. 用户在文本字段中输入信息 4.视图被驳回 5. 抓图方法中的代码继续。

这就是视图控制器的工作方式吗?如果我从一个按钮中呈现一个视图控制器,然后从新视图控制器中的另一个按钮中关闭呈现的视图控制器,那么原始方法中的代码会继续执行它停止的地方吗?

【问题讨论】:

  • 我在哪里提到了有关软件合同的任何内容?我问一个问题来帮助我更好地理解概念。如果您因为我使用“需要”一词而误解了第一句话,我的意思是我希望这成为应用程序的一个功能。
  • 试着缩小你的问题。一个很好的答案可能是几本书章节的大小。
  • 您要求 SO 社区帮助您概念化(并可能编写代码)应用程序的整个功能。你怎么不要求签约?
  • 我不要求任何代码。抱歉,如果问题的开头具有误导性,我只是想为我正在做的事情提供一些背景信息。我的实际问题只是对我问的最后一件事简单地是或否。

标签: ios view viewcontroller


【解决方案1】:

否。 原始方法中的代码在呈现UIAlertView(或UIActionSheet,或任何其他东西)后立即执行。它不会等待解雇。

要处理解除UIAlertView 的事件,例如有一种称为委托 的机制。它的工作原理是这样的:

  1. 您在 View Controller 中创建 UIAlertView
  2. 您将UIAlertView.delegate 属性设置为某个对象。通常是视图控制器本身。该对象应实现UIAlertViewDelegate 定义的几种方法。
  3. 您提交警报,您的代码会立即继续。
  4. 当用户单击某个按钮时,UIAlertView 会调用其委托上定义的方法之一。在我们的例子中,View Controller 将我们带回到我们的代码中。
  5. 在您的委托方法中,您“继续”在出现警报之前您想做的事情。

示例代码:

- (void)presentAlert {
    // 1
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Hello!"
                                                    message:nil
                                                   delegate:self // 2
                                          cancelButtonTitle:@"Eh?"
                                          otherButtonTitles:@"Hello!", @"Hi!", @"Aloha!" nil];
    [alert show]; // 3
    NSLog(@"Did present alert"); // immediately executed
}
// Between these method calls may pass several seconds, minutes or eternity.
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
    // 4, 5
    NSLog(@"Did click button %@", [alertView buttonTitleAtIndex:buttonIndex]);
}

此外,您必须在视图控制器上声明UIAlertViewDelegate 协议:

@interface YourViewController : UIViewController <UIAlertViewDelegate>

【讨论】:

  • 谢谢。非常清楚。但是有什么方法可以防止 [alert show] 之后的代码立即执行吗?让它等待用户输入?
  • @user2329239 不可能。如果您尝试这样做,整个应用程序将冻结,甚至演示动画都不会运行。
  • @user2329239 理论上,如果你的代码运行在后台线程上,是可以用同步方式组织代码的,但这并不好,也不容易。
【解决方案2】:

我相信您对 Viewcontrollers 有相当多的误解。但我无法在这里解释所有问题,否则这篇文章会变成一本书。所以这里有一个非常有用的链接(我希望你已经阅读过)和一些提示: https://developer.apple.com/library/ios/featuredarticles/viewcontrollerpgforiphoneos/Introduction/Introduction.html

Viewcontrollers 要么以模态方式呈现(堆叠在彼此之上),要么在公共 ParentViewController(例如 NavigationController 或 SlideViewController)中呈现。呈现控制器将始终保持控制器在后台运行或在呈现新控制器之前完成 Viewcontrollers 逻辑。因此,对您的问题的最短答案是否定的。

特别注意 Viewcontroller 生命周期。 ViewController 有特殊的回调方法,在某些情况下会被调用。留意 viewDidLoad 和 viewDidAppear - 方法,这将大大消除您的困惑。

最后,同样重要的是,看看委托模式。委托是一种在视图控制器之间发送消息的方式。因此,您可以让取名的 ViewController 向拍摄照片的 viewController 发送一条带有所选名称的消息。 这是委托编程指南的链接: https://developer.apple.com/library/ios/documentation/general/conceptual/CocoaEncyclopedia/DelegatesandDataSources/DelegatesandDataSources.html

我希望这能让你开始

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-11
    • 2013-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    相关资源
    最近更新 更多