4

I am new with Objective-C so apologies for a dumb question.

I am opening an "options" view controller from my main view controller. Both are built in the storyboard. Before and after presenting the options controller I need to stop and start a timer on my main view controller. After the options controller is closed (a button calls dismiss) I need to send some info back to my main controller or at least let my main controller know that it needs to refresh some values.

MAIN QUESTION What's the best way of presenting a view controller and executing some presenter's methods before and after opening?

WHAT I'VE TRIED I found a few ways to do it, but they are all cumbersome and I assume that there must be some plausible way of doing it.

  1. Ideally I'd like to use the segue I set up in the storyboard between the two controllers.
  2. I managed to call the options controller programmatically by accessing the storyboard and calling instantiateViewControllerWithIdentifier. It worked but looks a bit complex.
  3. I was not able to find a delegate method on the UIViewController to handle the dismiss event
  4. When I was trying to access the main controller in the options controller via presentingViewController and downcasting it, I got a linkage error by including my .h file twice (not sure what are the Obj-C standards of using #define).

Appreciate your help...

4

5 に答える 5

2

NSNotificationCenterこれはすべて、ストーリーボードと、および NSCodingを使用して非常に簡単に実行できます。viewDidLoadメイン コントローラーのメソッドに、次のコードを挿入します。

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(receiveNotification:) 
                                             name:@"Update"
                                           object:nil];

次に、同じコントローラーでこのメソッドを作成します。

(void)receiveNotification:(NSNotification*)notification
{
   //...
}

オプション コントローラからメイン コントローラを更新する場合:

[[NSNotificationCenter defaultCenter] postNotificationName:@"Update" object:self];

NSArchivingまた、 Basic Data Persistence にも使用することをお勧めします。このチュートリアルを見つけたところ、かなり良さそうです。 http://samsoff.es/posts/archiving-objective-c-objects-with-nscoding

基本的には、情報を格納できるオブジェクトを作成し、nscoding を使用してコーディングし、必要なときにいつでもアンコーディングします。それは私にとってとてもうまくいきました。

それが役立つことを願っています!

于 2012-06-27T19:04:20.750 に答える
2

主な質問 View Controller を表示し、開く前と後にいくつかのプレゼンターのメソッドを実行する最良の方法は何ですか?

上記の回答があなたが望むよりも少し複雑な場合に備えて、開く前にプレゼンターのメソッドを実行する最も簡単な方法は、プレゼンターの prepareForSegue メソッドで実行することです。送信先のビュー コントローラーにデータを送信する必要がある場合は、次の方法でそのプロパティにアクセスできます。

ViewController *destinationVC = [segue destinationViewController];

開いた後にプレゼンターのメソッドを実行する簡単な方法は次のとおりです。

ViewControllerSubclass *previousVC = [self presentingViewController];

次に、クラスまたはインスタンスを使用して、クラスまたはインスタンス メソッドを実行します。これは、宛先の viewWillAppear で行うことができます。

このすべてをすでに知っていたら申し訳ありません。多くの場合、必要な複雑さのレベルを推測するのは困難です。

于 2012-06-27T19:32:02.333 に答える
2

リンクが弱い ViewController 間の通信には、NSNotificationCenter を使用できます。

https://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Classes/NSNotificationCenter_Class/Reference/Reference.html

ここで、リッスンしているすべての ViewController にメッセージを送信できます。これらの ViewController は、いくつかの変更 (たとえば、フォント サイズを変更するオプション) を処理する必要があります。

実装は非常に簡単で、特定の ViewController が相互に依存しにくくなります。

于 2012-06-27T18:02:35.820 に答える
1

市場に出回っているほぼすべてのアプリでこれに遭遇しました。違いは、絵コンテの道をたどることを決めたことがないということです。

私が常にこれを達成できた方法は、コントローラー間にアクセサー関数を提供することです。オプションビューヘッダー内でクロス定義コントローラーを単に UIViewController タイプとして定義し、メインビューコントローラーのヘッダーのみを .m ファイルに含めることで、リンカーの問題を回避できます。オプション ビューからメイン ビュー コントローラー ルーチンを呼び出す場合、メイン ビュー コントローラーの型にキャストする必要があります。

また、メイン ビュー コントローラーへのポインターを保持する変数を self に設定できるルーチンをオプション ビューに提供する必要があります。

optionsView の例

@interface optionsViewController : UIViewController{
    UIViewController * myReactiveMainViewController;
}

-(void)setMyReactiveMainViewController:(UIViewController *)controller;

optionsView の .m ファイルで No

#import "myMainViewController.h"

-(void)setMyReactiveMainViewController:(UIViewController *)controller{
    myReactiveMainViewController = controller;
}

メインView Controllerへの他のコールバックでは、これを行う必要があります:

-(void)returnToMain{
    [(myMainViewController *)myReactiveMainViewController someCall:variable];
}

もちろん、この例では、myMainViewController が入力パラメーターを受け取る「someCall」というメソッドを実装していると想定しています。

于 2012-06-27T18:04:55.070 に答える
0

返信ありがとうございます。

私は

  1. prepareForSegueを呼び出して、移行前のコードを実行します

  2. 提示されたViewControllerを解放するときに、presentingViewControllerでperformSelectorを呼び出します。

他の提案もうまくいくと確信しています。

于 2012-07-19T19:16:58.213 に答える