【问题标题】:UILabel update issue for newly clicked cells in TableView - first clicked cell title is retainedTableView 中新单击的单元格的 UILabel 更新问题 - 保留第一次单击的单元格标题
【发布时间】:2011-12-18 21:29:09
【问题描述】:

我对 iOS 开发还很陌生,但经过大量搜索后仍未找到解决此问题的方法。

问题在于,当单击表格单元格时,它的标题信息(从索引处的数组构建)被发送到详细视图控制器上的 UILabel。 那么点击返回MasterViewController TableViewCells后,选择不同的单元格后,它的标题并没有传递给UILabel,而保留之前或第一个点击的项目信息。

这可能是释放/保留问题,或表 reloadData 问题,但无论我尝试在何处为我的对象或表添加这些内容,它都不会将 DetailViewController 上的“currentNodeTitle”重置为之前新单击的单元格将其发送到 UILabel。

这是我的设置:

我有一个表格,其中包含从名为 nodeTitles 的 NSMutableArray 创建的单元格。

数组数据的NSLog输出为 节点标题:( 问题, “问题 2”, “问题3”, “问题 4”, “问题 5”, “问题 6”, “问题 7” )

在 MasterViewController.h 中:

@class DetailViewController;

@interface MasterViewController : UITableViewController {
    NSMutableArray * nodeTitles;
}

@property (strong, nonatomic) DetailViewController *detailViewController;
@property (nonatomic, retain) NSMutableArray *nodeTitles;    
@end

在 MasterViewController.m 中:

从数组中创建每个单元格,其中包含每个索引行的内容。

nodeTitles = [[NSMutableArray alloc]initWithObjects:@"Issue", @"Issue 2",@"Issue 3", @"Issue 4", @"Issue 5", @"Issue 6", @"Issue 7", nil];

cellForRowAtIndexPath:

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

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease];
    if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) {
        cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
    }
}

//*only thing added*
cell.textLabel.text = [self.nodeTitles objectAtIndex: [indexPath row]];
//*end only thing added*

return cell;}

那么对于 didSelectRowAtIndexPath

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
    if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) {
        if (!self.detailViewController) {
            self.detailViewController = [[[DetailViewController alloc] initWithNibName:@"DetailViewController_iPhone" bundle:nil] autorelease];

        self.detailViewController.currentNodeTitle = [nodeTitles objectAtIndex:indexPath.row];
        //[contentTitleArray release];

    }
        [self.navigationController pushViewController:self.detailViewController animated:YES];
    }
}

此时一切正常。我有一个表格视图单元格列表,其中包含我的数组中的内容,单击时,我已将它们链接到 UILabel。

我在 MasterViewController 中的 Dealloc、viewDidUnload、viewWillAppear、viewDidAppear 和 viewWillDissappear:

- (void)dealloc
    {
      [self.nodeTitles release];
      [_detailViewController release];
      [super dealloc];
    }
- (void)viewDidUnload
{
    [super viewDidUnload];
    // Release any retained subviews of the main view.
    self.nodeTitles = nil;
}

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    [self.tableView reloadData];
}

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
}

- (void)viewWillDisappear:(BOOL)animated
{
    [super viewWillDisappear:animated];
    [self.tableView reloadData];
}

我的 DetailViewController.h:

@interface DetailViewController : UIViewController <UISplitViewControllerDelegate> {
    IBOutlet UILabel *detailDescriptionLabel;
    NSMutableString *currentNodeTitle;
}

@property (strong, nonatomic) id detailItem;

@property (nonatomic, retain) IBOutlet UILabel *detailDescriptionLabel;
@property (nonatomic, retain)NSMutableString *currentNodeTitle;

@end

DetailViewController.m

@interface DetailViewController ()
@property (strong, nonatomic) UIPopoverController *masterPopoverController;
- (void)configureView;
@end

@implementation DetailViewController

@synthesize detailItem = _detailItem;
@synthesize detailDescriptionLabel = _detailDescriptionLabel;
@synthesize masterPopoverController = _masterPopoverController;
@synthesize currentNodeTitle;

- (void)dealloc
{
    currentNodeTitle = nil;
    [_detailItem release];
    [_detailDescriptionLabel release];
    [_masterPopoverController release];
    [super dealloc];
}

DetailViewController.m 上的 viewDidLoad 中,我将 UILabel 项设置为:

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.title = currentNodeTitle;
    _detailDescriptionLabel.text = currentNodeTitle;

    [self configureView];    
}

- (void)viewDidUnload
{
    [super viewDidUnload];
   [currentNodeTitle release];
}

点击一个项目后,点击返回到主控制器,如何在 DetailViewController 上的 UILabel 中显示新选择的单元格标题?

谢谢~

【问题讨论】:

  • 指定您的问题并告诉我您想要什么?

标签: iphone uitableview uiviewcontroller uilabel


【解决方案1】:
if (!self.detailViewController) {
    self.detailViewController.currentNodeTitle = [nodeTitles objectAtIndex:indexPath.row];
}

我认为这个 IF 语句不会再次执行,因为 detailViewController 是有效的。 将 currentNodeTitle 赋值移出 IF 块。

编辑
您保留了 detailViewController,因此看起来 viewDidLoad 只被调用一次,这是您使用 currentNodeTitle 的唯一地方。

尝试移动

self.title = currentNodeTitle;
_detailDescriptionLabel.text = currentNodeTitle;

to viewWillAppear:因为每次推送 detailViewController 时都会调用它。

【讨论】:

  • 我做了这个改变但没有成功。重新选择单元格(在选择初始单元格后)仍然使用单击的第一个单元格中的 UILabel 标题信息。 - 还有其他想法吗?我认为这一定是某个地方的发布或保留问题。
  • 这很有效,非常感谢!如果我有更多的代表点,我会 +50 你!
【解决方案2】:

当您制作新标签时,只需重新加载表格即可。有人认为您也应该遵循这一点,在if(cell == nil) { [cell.contentView addSubview:label]; } 中制作标签,然后制作此标签的标签,然后在此条件后查看标签label = (UILabel*)[cell.contentView viewWithTag:labeltag]

可能会帮助您解决问题。

【讨论】:

  • Emon,我无法理解您的解决方案。我已经通过添加将 detailLabelItem 设置在 - (void)viewWillAppear:(BOOL)animated 中的 DetailViewController.m 代码来完成这项工作。尽管如此,感谢您的回复
猜你喜欢
  • 2020-12-20
  • 1970-01-01
  • 2020-03-14
  • 1970-01-01
  • 1970-01-01
  • 2021-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多