0

私のアプリにはテーブルビューがあります。テーブル ビューの行を選択UIViewすると、 が表示され、情報が表示されます。行のタイトルは、文字列を含む plist ファイルから取得されます。plist ファイルには、行のタイトルに関連付けられた電話番号を含む文字列も含まれています。カスタムUIViewにはボタンがあります。ボタンをクリックすると、plistファイルで宣言されている番号を呼び出す必要があります。ユーザーがクリックした行に関連付けられている番号。

どうすればこれを達成できますか?

アクションは通常の IBAction です。

- (IBAction)callNumber:(id)sender;

IB(Xcode 4)のボタンに接続されています。

誰かが私の問題の解決策を持っていれば幸いです、ありがとう。

編集

わかりやすくするために、テーブル ビューで選択した行に関連付けられている電話番号を取得したいと思います。plist 内の文字列には、電話番号名「phone」のキーがあります。

NSString *phone = [[tableList objectAtIndex:indexPath.row] objectForKey:@"phone"];

「tablelist」は NSMutableArray です。キー「phone」を取得して、NSString *phone に保存したいと思います。これらすべてが IBAction に含まれています。クラス全体を投稿するのに役立ちますか?

4

4 に答える 4

3

これには洗練された解決策があり、UITableViewCell. UIButton のタグを行のインデックスに設定します。

- (UITableViewCell *)tableView:(UITableView *)tableView 
         cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString* CellIdentifier = @"Cell";

    YourCustomCell* cell = (YourCustomCell*)[tableView 
                              dequeueReusableCellWithIdentifier:CellIdentifier];

    //  All the code for loading a cell

    //  Other code you have for configuring the cell

    //  HERE'S THE IMPORTANT PART: SETTING THE
    //  BUTTON'S TAG TO THE INDEX OF THE ROW
    cell.phoneButton.tag = indexPath.row;

    return cell;    
}

次に、アクション コードで、タグからインデックスを取得できます。

- (IBAction)callNumber:(id)sender {
    UIButton* button = sender;
    int index = button.tag;
    NSString *phone = [[tableList objectAtIndex:indexPath.row] objectForKey:@"phone"];
    //  Make the phone call
}
于 2011-11-23T21:53:59.943 に答える
1

選択された行のインデックス パスを示す「カスタム ビュー」のプロパティが必要です。これをカスタム ビュー コントローラーのヘッダーに配置して、このプロパティを宣言できます。

@interface MyCustomViewController : UIViewController {
    ...
    NSIndexPath * indexPath;
}
@property (nonatomic, retain) NSIndexPath * indexPath;

次に、次のように実装をセットアップします。

@implementation MyCustomViewController
@synthesize indexPath;
...
// only needed if not using ARC
- (void)dealloc {
    self.indexPath = nil;
    ...
    [super dealloc];
}
@end

次に、tableView:didSelectRowAtIndexPath:メソッドで、通常どおりビュー コントローラーを作成しindexPathますが、今後アクセスできるようにプロパティを設定します。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    MyCustomViewController * vc = [[MyCustomViewController alloc] initWithBundle:nil nibName:nil];
    [vc setIndexPath:indexPath];
    [self presentModalViewController:vc];
    // if not using ARC
    [vc release];
}

次に、 の任意の場所に、選択されたインデックス パスの行を取得するようにMyCustomViewController.m記述します。self.indexPath.row

于 2011-11-23T21:53:05.123 に答える
0

簡単な一時的な回避策としてできることは次のとおりです。

Cell Selected メソッド: - 選択された indexPath.row の NSUserDefault を保存します。

そして、次のビューで: - 読み取られた行の NSUserDefault 値を読み取ります

これにより、次のビューにどのビューが選択されたかが通知され、適切なデータを取得できるようになります。

于 2011-11-23T21:48:52.120 に答える
0

インデックス パスを知る必要があるアクションを実行する UITableViewCell にコントロールがある場合、使用できるメソッドがいくつかあります。

  1. 単一のセクション (またはコントロールを含むセルの既知のセクション) があり、tagプロパティを他の目的で使用していない場合は、行 + 1 をtagプロパティに格納します。次に、アクションが呼び出されて取得するsender.tag - 1と、行インデックスが取得されます。

  2. に到達するまで、コントロールからスーパービュー チェーンを上っていきますUITableViewCell[tableView indexPathForCell:cellindexPath を取得するための呼び出し。

  3. コントロールのサブクラスを作成し、indexPath をコントロールに格納します。

于 2011-11-23T21:50:58.043 に答える