2

私はこの質問が何度か聞かれたことを知っており、このトピックに関する既存の投稿を読みましたが、それでも助けが必要です。

私には2-UIViewControllers親と子がいます。以下のように子UIViewControllerを表示presentModalViewControllerします。

ChildController *child = 
 [[ChildController alloc] initWithNibName:@"ChildView" bundle:nil];
[self presentModalViewController:child animated:YES];
[child release];

子ビューには。がありUIPickerViewます。ユーザーがアイテムを選択してUIPickerView[完了]をクリックすると、モーダルビューを閉じて、選択したアイテムをUITextField親ビューのに表示する必要があります。

子供のボタンクリックdelegateで、私は次のことを行います。

ParentController *parent = 
 (ParentController *)[self.navigationController parentViewController];
[parent.myTextField setText:selectedText];
[self dismissModalViewControllerAnimated:YES];

すべてがエラーなしで機能します。しかし、更新されたを表示するように親ビューをロードする方法がわかりませんUITextField

私は試した

[parent reloadInputViews];

動作しません。助けてください。

4

3 に答える 3

13

委任は進むべき道です。より簡単な解決策を探している人もいますが、私が他の人を試したことがあると信じてください。委任よりもうまくいくものはありません。したがって、同じ問題を抱えている人は、委任について読み、段階的にそれに従ってください。

subviewcontroller.hで-プロトコルを宣言し、その中でデリゲートmthodsを宣言します。

@protocol myDelegate
 -(void)clickedButton:(subviewcontroller *)subController;
@end

subviewcontroller.hの@interface内:

id<myDelegate> delegate;
@property (nonatomic, assign) id<myDelegate> delegate;    
NSString *data;
-(NSString *)getData;

subviewcontroller.mで、myDelegateを合成します。次のコードを、サブビューが想定どおりに実行されたことをparentviewcontrollerに通知する場所に追加します。

 [delegate clickedButton:self];

次に、getDataを処理して、parentviewcontrollerに送信するデータを返します。

parentviewcontroller.hで、subviewcontroller.hをインポートし、そのデリゲートを使用します

 #import "subviewcontroller.h"
 @interface parentviewcontroller : VUIViewController <myDelegate>
 {}

parentviewcontroller.mで、デリゲートメソッドを実装します

 - (void)clickedButton:(subviewcontroller *)subcontroller
 {
   NSString *myData = [subcontroller getData];
   [self dimissModalViewControllerAnimated:YES];
   [self reloadInputViews];
 }

メモリ管理を忘れないでください!

于 2010-03-17T18:37:09.980 に答える
0

-(void)viewWillAppear:(BOOL)アニメーションは、モーダルビューコントローラーの場合とまったく同じように呼び出されません。理由はわかりません。このアプリのどこでも誤ってオーバーライドされることはなく、私が取り組んでいる他の2つのアプリでも同じ問題が発生します。私は本当にそれがうまくいくとは思いません。

以前はデリゲートアプローチを使用しましたが、次のアプローチもかなり良いと思います。

次のように、UIViewControllerにプライベートカテゴリを追加することでこれを回避します。

.hファイル:

@interface UIViewController(Extras)
// returns true if this view was presented via presentModalViewController:animated:, false otherwise.
@property(readonly) BOOL isModal;
// Just like the regular dismissModalViewController, but actually calls viewWillAppear: on the parent, which hasn't been working for me, ever, for modal dialogs.
- (void)dismissModal: (BOOL) animated;
@end

および.mファイル:

@implementation UIView(Extras)
-(BOOL) isModal
{
    return self == self.parentViewController.modalViewController;
}

- (void)dismissModal: (BOOL) animated
{
    [self.parentViewController viewWillAppear: animated];
    [self dismissModalViewControllerAnimated: animated];
}
@end

ダイアログボックスを閉じたいときに、このように呼び出すことができます。

// If presented as a modal view, dismiss yourself. 
if(self.isModal)
    [self dismissModal: YES];

これで、viewWillAppearが正しく呼び出されます。

そして、はい、私はボーナスの「isModal」プロパティを寄付しています。これにより、モーダルビューは、それがどのように表示されていたかを認識し、適切に却下できます。

于 2010-11-25T20:28:51.593 に答える
0

モーダルビューの表示中にメモリ不足の警告が発生した場合、親のビューはアンロードされます。次にparent.myTextField、ビューが再ロードされるまで、右側のテキストフィールドを参照しなくなります。呼び出すだけで、ビューのリロードを強制できますparent.view;

ただし、親ビューに子ビューで設定できるStringプロパティを設定することをお勧めします。次に、親ビューが再表示されたら、そのデータをテキストフィールド(viewWillAppear:たとえば、内部)に入力します。親ビューが最初に表示されるときの値をデフォルト値に設定する必要があります。

于 2010-03-09T22:51:05.333 に答える