2

UITableViewCellにはUIButton、ユーザーがタッチしたときにテーブルセルの特定のオブジェクトで指定された電話番号に電話をかけると想定される電話を表す があります。 ここに画像の説明を入力

複数のボタンがあり、各ボタンには特定の電話番号があるため、tagプロパティをUIButtoncurrentに設定しようとしていますindexPath.rowが、最初の 6 つのセルでは機能しますが、セルが再利用され始めると、タグは 0 に戻りますすべてのボタンに。ボタンのタグを再利用ブロックの外に設定しています。これは、一意の各セルを識別するためにこれを行う適切な方法であると考えました。

テストのために、cell.tagプロパティも に設定しましたがindexPath.row、完全に機能するため、UIButton に確実に分離されています。私が間違っているかもしれないことについてのアイデアはありますか?

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *SchoolCellIdentifer = @"SchoolCellIdentifier";

    SchoolInfoItem *item = [self.schoolArray objectAtIndex:indexPath.row];

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:SchoolCellIdentifer];


    // If the cell doesn't existing go ahead and make it fresh.
    if (cell == nil)
    {        
        // Begin Phone button view
        UIButton *phoneButton = [[UIButton alloc] initWithFrame:CGRectMake(67, 70, 35, 35)];
        phoneButton.tag = 80;
        UIImageView *phoneView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"phone-icon.png"]];
        phoneView.frame = CGRectMake(2.5, 2.5, 30, 30);
        [phoneButton addSubview:phoneView];
        [cell.contentView addSubview:phoneButton];

    }

    cell.tag = indexPath.row;
    phoneButton = (UIButton *) [cell viewWithTag:80];
    [phoneButton addTarget:self action:@selector(callPhoneNumber:) forControlEvents:UIControlEventTouchUpInside];
    phoneButton.tag = cell.tag;
    NSLog(@"phoneButton tag: %d", phoneButton.tag);
    NSLog(@"cell tag:%d", cell.tag);

return cell
}

TouchEvent のメソッドは次のとおりです。

- (void) callPhoneNumber:(id)sender
{
    UIButton *button = (UIButton *) sender;
    SchoolInfoItem *schoolItem = [self.schoolArray objectAtIndex:button.tag];
    NSLog(@"tag at: %d", button.tag);

    if ([schoolItem.MainPhone length] != 0)
    {
        NSString *URLString = [@"tel://" stringByAppendingString:schoolItem.MainPhone];
        NSURL *URL = [NSURL URLWithString:URLString];
        NSLog(@"%@", URL);

        [[UIApplication sharedApplication] openURL:URL];
    }
}
4

3 に答える 3

7

タグは、これを処理する正しい方法ではありません。MyPerson の属性を使用して UITableViewCell をサブクラス化することをお勧めします。 [注: 必要に応じて Person を School に置き換えてください]このように:

@interface MyPerson : NSObject
@property (...) NSString *phoneNumber;
@property (...) NSString *emailAddress;
@end

@interface MyPersonCell : UITableViewCell
@property (readwrite) MyPerson *person;
- (IBAction) callPhoneNumber;
- (IBAction) sendEmail;
@end

次に、tableView:cellForRowAtIndexPath:実装でセルを次のように構成します

cell.person = [get person from datasource for section+row];

さらに、UIButton アクションは、セル自体 (上記のコードで示されているように) またはテーブル ビュー コントローラー自体にリンクします。

Xcode ストーリーボードを使用する場合は、「プロトタイプ セル」を使用し、 で構成しMyPersonCell、 を追加してUIButton、ボタン アクションをセルにリンクします。

于 2013-05-14T21:52:36.960 に答える
0

(タグを使用する代わりに) これを処理する別の方法は、ボタンが押されるたびに、次のページに示すように処理することです: https://stackoverflow.com/a/1802875/250164

GoZoner の提案によると、データソースは実際には Person オブジェクトで構成されている必要があります。

于 2013-05-14T22:46:44.547 に答える