Назначение переменных из UITableViewCell для твита в контроллере основного представления - PullRequest
0 голосов
/ 15 января 2012

Мне удалось переназначить переменные UITableViewCell и заставить его твитнуть с помощью TWTweetComposeViewController, но я столкнулся с проблемой. Всегда чирикать переменные из последней строки в UITableView.

Вот мои настройки: у меня есть 1 кнопка твита и 4 UILabels в UITableViewCell. 4 UILabels извлекают информацию из Plist для заполнения таблицы. В каждой ячейке есть кнопка «твит», чтобы твитнуть информацию о ячейке, но тут я столкнулся с проблемой. Он всегда отправляет в Твиттере информацию из последней строки таблицы, а не из строки, в которой она находится. Любая помощь очень ценится.

UITableViewCell.h

@property (nonatomic, strong) IBOutlet UILabel *playerOneLabel;
@property (nonatomic, strong) IBOutlet UILabel *playerOneScoreLabel;

@property (nonatomic, strong) IBOutlet UILabel *playerTwoLabel;
@property (nonatomic, strong) IBOutlet UILabel *playerTwoScoreLabel;

Настройка основного вида контроллера:

// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *CellIdentifier = @"ScoreListCell";

    ScoreCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    // Configure the cell...

    NSDictionary * dictionary = [scoresArray objectAtIndex:indexPath.row];
    cell.playerOneLabel.text = [dictionary objectForKey:@"playerOneName"];
    cell.playerOneScoreLabel.text = [dictionary objectForKey:@"playerOneScore"];
    cell.playerTwoLabel.text = [dictionary objectForKey:@"playerTwoName"];
    cell.playerTwoScoreLabel.text = [dictionary objectForKey:@"playerTwoScore"];

    self.player1Name = cell.playerOneLabel;
    self.player1Score = cell.playerOneScoreLabel;           
    self.player2Name = cell.playerTwoLabel;
    self.player2Score = cell.playerTwoScoreLabel;

    return cell;
}

и, наконец, настройка твита в контроллере основного вида:

- (IBAction)twitter:(id)sender {

    if ([TWTweetComposeViewController canSendTweet])
    {
        TWTweetComposeViewController *tweetSheet = 
        [[TWTweetComposeViewController alloc] init];
        NSString *text = [NSString stringWithFormat:@"%@-%@, %@-%@", 
                          player1Name.text, player1Score.text, player2Name.text, player2Score.text];
        [tweetSheet setInitialText:text];
        [self presentModalViewController:tweetSheet animated:YES];
    }
    else
    {
        UIAlertView *alertView = [[UIAlertView alloc] 
                                  initWithTitle:@"Sorry"                                                             
                                  message:@"Tweet unsuccessful. Make sure your device has an internet connection and you have a Twitter account."                                                          
                                  delegate:self                                              
                                  cancelButtonTitle:@"OK"                                                   
                                  otherButtonTitles:nil];
        [alertView show];
    }
}

1 Ответ

1 голос
/ 15 января 2012

Вы ошибочно полагаете, что ячейка визуализируется / создается в то же самое время, когда пользователь нажимает на эту кнопку твита.

Вы можете, например, добавить к кнопке твита тег, который отражает индекс строки, в котором он показан.

// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{
    static NSString *CellIdentifier = @"ScoreListCell";

    ScoreCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    // Configure the cell...

    //assign the row-index as a button tag - 
    //NOTE: this misses the way you fetch/create your tweetButton - 
    //      that would have to left to you as you missed to quote 
    //      that part in your sources
    UIButton *tweetButton = ???;

    tweetButton.tag = indexPath.row;

    NSDictionary * dictionary = [scoresArray objectAtIndex:indexPath.row];
    cell.playerOneLabel.text = [dictionary objectForKey:@"playerOneName"];
    cell.playerOneScoreLabel.text = [dictionary objectForKey:@"playerOneScore"];
    cell.playerTwoLabel.text = [dictionary objectForKey:@"playerTwoName"];
    cell.playerTwoScoreLabel.text = [dictionary objectForKey:@"playerTwoScore"];

    return cell;
}

Как только эта кнопка активирована, в подключенном методе действия вы просто извлекаете этот индекс из тега и используете его для адресации правильных данных в вашем словаре.

Обратите внимание, что я оставил для вас любые проверки диапазона и дальнейшие действия защитного программирования.

- (IBAction)twitter:(id)sender 
{
    UIButton *tweetButton = (UIButton *)sender;
    unsigned int rowIndex = tweetButton.tag;

    NSDictionary * dictionary = [scoresArray objectAtIndex:rowIndex];
    NSString *playerOneNameText = [dictionary objectForKey:@"playerOneName"];
    NSString *playerOneScoreText = [dictionary objectForKey:@"playerOneScore"];
    NSString *playerTwoNameText = [dictionary objectForKey:@"playerTwoName"];
    NSString *playerTwoScoreText = [dictionary objectForKey:@"playerTwoScore"];

    if ([TWTweetComposeViewController canSendTweet])
    {
        TWTweetComposeViewController *tweetSheet = 
        [[TWTweetComposeViewController alloc] init];
        NSString *text = [NSString stringWithFormat:@"%@-%@, %@-%@", 
                          playerOneNameText, playerOneScoreText, playerTwoNameText, playerTwoScoreText];
        [tweetSheet setInitialText:text];
        [self presentModalViewController:tweetSheet animated:YES];
    }
    else
    {
        UIAlertView *alertView = [[UIAlertView alloc] 
                                  initWithTitle:@"Sorry"                                                             
                                  message:@"Tweet unsuccessful. Make sure your device has an internet connection and you have a Twitter account."                                                          
                                  delegate:self                                              
                                  cancelButtonTitle:@"OK"                                                   
                                  otherButtonTitles:nil];
        [alertView show];
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...