2

splitView私は私のアプリケーションに取り組んでいますiPadUIButtonas と呼ばれるものを実装しましたUpload。クリックすると、 のUITableView中に が表示されUIPoverControllerます。UIwebViewコンテンツのいずれかをクリックすると、それぞれのサイトを my inに表示したいと思いますUIDetailView。このために、 を実装しましたdelegate method protocol。ファイルで次のコード行を使用しましたUploadTableViewController.h::

@protocol UploadTableViewDelegate <NSObject>
@required
- (void)selected:(NSString *)his;
@end


 @interface UploadSpaceTableViewController : UITableViewController{
id<UploadSpaceTableViewDelegate> delegate;
}

@property (retain) id delegate;
@end

対応する.mファイルで、次のコード行を使用しました::

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{

if (delegate != nil) {
    NSString *hisSelected = [keys objectAtIndex:indexPath.row];
    NSLog(@"%@ lolwa", hisSelected);
    [delegate selected:hisSelected];
}

}

関数を実装したクラスの.mファイルではSelected、コードは::

- (void)selected:(NSString *)Key {    
  NSLog(@"hello");    
  [self.UploadSpaceTableViewPopover dismissPopoverAnimated:YES];
}


-(IBAction)uploadpressed:(id)sender{  
Upload.delegate = self;
self.Upload = [[UploadSpaceTableViewController alloc] 
                         initWithStyle:UITableViewStylePlain];
self.UploadTableViewPopover = [[UIPopoverController alloc] 
                                initWithContentViewController:UploadSpace];               

[self.UploadTableViewPopover presentPopoverFromBarButtonItem:sender 
                                permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
 }

しかし、 gdbhelloで(関数に書かれているSelected)取得できません。NSLoggedこれを使用するのは初めてですdelegate method protocol。私はこれを整理することができません。誰かが私を助けることができますか?ありがとうございます。

4

2 に答える 2

5

[delegate keySelected:hisKeySelected];あなたの最初の問題です。という名前のデリゲート メソッドを宣言するのではなく、 という名前-keySelected:のデリゲート メソッドを宣言します-Selected:

2 番目の問題は、テーブル ビューのデリゲートではないという事実です。デリゲート メソッド-didSelectRowAtIndexPath:が呼び出されるようにするには、テーブルのデリゲートである必要があります。

PS、インスタンスまたはメソッド名を大文字で始めないでください。ObjC では、大文字はクラスを示します。

編集:これはあなたのUploadSpaceTableViewControllerヘッダーがどのように見えるべきかです:

@protocol UploadTableViewDelegate <NSObject>
@required
- (void)selected:(NSString *)his;
@end

@interface UploadSpaceTableViewController : UITableViewController<UITableViewDataSource, UITableViewDelegate>
@property (nonatomic, assign) id <UploadSpaceTableViewDelegate>delegate; //delegates are weak!!!
@end

そして、.m では、多くの不要なものをスキップします。

-(void)viewDidLoad {
    [self.tableView setDelegate:self];
    [self.tableView setDataSource:self];
}
//other code

さらに、デリゲートは保持と宣言されています。これは、ObjC では絶対に No-No です。ARC を使用している場合は Declare が弱いです。そうでない場合は割り当てます。

-uploadPressed:また、オブジェクトを明示的に所有または初期化する前に設定することにより、メソッドで nil デリゲートを生成しています。表示方法は次のとおりです。

self.Upload = [[UploadSpaceTableViewController alloc]initWithStyle:UITableViewStylePlain];
Upload.delegate = self;
于 2012-06-28T08:41:06.583 に答える
4

委任は次のように機能します

  • プロトコルを宣言します - あなたはこれをしました
  • デリゲート プロパティを宣言する - これで完了です
  • デリゲートになりたいクラスでは、プロトコルに準拠していると言います

    @interface MyClass : MySuperClass <UploadTableViewDelegate>

  • デリゲート クラスがデリゲート メッセージを取得できるようにデリゲート プロパティを設定します。

    uploadSpaceTVC.delegate = self;

  • 非デリゲート クラスでデリゲート メソッドを呼び出す ( UploadSpaceTableViewController)

    [self.delegate selected:@"test"];

于 2012-06-28T08:53:24.517 に答える