【问题标题】:Customizing the Popping of a View Controller Xcode自定义视图控制器 Xcode 的弹出
【发布时间】:2013-02-21 17:55:40
【问题描述】:

我在 Xcode 4.6 中有一个使用情节提要的应用程序。在我的应用程序中,我有两个相关的视图控制器:一个用于提出问题,一个用于提供对所提问题的答案。 (作为 iOS 新手)我最初将其设置为问题控制器推送到答案控制器,答案控制器(通过按钮)推送到问题控制器(针对新问题)等等on,从而导致巨大的导航堆栈和内存崩溃,应用程序使用的时间越长。

所以,我认为我需要执行以下操作:问题控制器应该继续回答控制器,然后我需要答案控制器弹出回问题控制器但带有新的问题图像。我在问题控制器的 viewWillAppear 方法中放置了重置图像的代码,该方法工作正常,但这里有一个问题:我并不总是希望每次出现问题控制器时都重置图像。如果选择了答案控制器中的答案,我只希望它重置。我尝试在问题控制器上从答案控制器设置一个 bool 属性以有条件地重置视图,但这不起作用。

第二个问题是,为了记忆,我需要跳回问题控制器,但为了风格,我想给出一个 push segue 的错觉。我不知道这是否可能。

简而言之,我的两个主要问题是:
1) 是否可以有条件地重置我要弹出的控制器的视图?

2) 是否可以动画视图控制器从右到左而不是从左到右弹出?

谁能为我回答这些问题,或者甚至为我试图解决的最终内存问题提出一个完全不同的解决方案?谢谢。

【问题讨论】:

    标签: xcode uiviewcontroller uinavigationcontroller uistoryboardsegue


    【解决方案1】:

    1.对我来说,这听起来像是委托的工作。在您的答案 VC 中,您将为代表声明一个 protocol 和一个 iVar。像这样的:

    @protocol AnswerDelegate
    - (void)answerSelected:(NSString *)answer forQuestion:(NSString *)passedQuestion;
    @end
    

    然后添加委托属性和弱iVar,(也为问题添加了公共属性):

    @interface MyAnswerViewController : UIViewController {
        __unsafe_unretained id <AnswerDelegate> _delegate;
    }
    
    @property (nonatomic, assign) id <AnswerDelegate> delegate;
    @property (nonatomic, strong) NSString *passedQuestion;
    

    然后在MyAnswerViewController 的实现文件中,当给出答案时,您将触发委托方法:

    [self.delegate answerSelected:@"Answer" forQuestion:@"PassedQuestion"];
    

    在问题 VC 中,您需要做的就是将自己声明为该协议的代表:

    @interface MyQuestionViewController : UIViewController <AnswerDelegate>
    

    然后在实现文件的某处,实现委托方法:

    - (void)answerSelected:(NSString *)answer forQuestion:(NSString *)passedQuestion {
      // Do something with the question and answer
      // Pop the VC if needed
    }
    

    这是处理将对象传回调用类的一种非常简单的方法。

    2.这需要实现您自己的过渡动画。请参阅下面的 SO 帖子:

    UINavigationController: pop view controller in the opposite direction

    【讨论】:

    • 感谢您的建议。我刚才尝试使用委托,但委托方法没有被触发。我不知道为什么,我把所有的东西都准备好了。这与我在尝试使用指向答案类中的问题类的指针来设置问题类的属性时遇到的相同问题...
    • 确保在 prepareForSegue 方法中将 QuestionVC 设置为 AnswerVC 的委托: AnswerVC *avc = segue.destinationViewController; avc.delegate = self;
    • 啊!我正在创建一个新指针,而不是使用 segue.destinationViewController。谢谢!!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-27
    • 1970-01-01
    • 1970-01-01
    • 2011-05-15
    • 2011-02-11
    • 1970-01-01
    相关资源
    最近更新 更多