UITableView 单元格在索引 0 中显示“null”值

Posted

技术标签:

【中文标题】UITableView 单元格在索引 0 中显示“null”值【英文标题】:UITableView cell displays "null" value in index 0 【发布时间】:2013-10-08 03:39:19 【问题描述】:

我在 VC 中有 textview。使用 nsuserdefaults 保存此文本视图并稍后获取。在 VC1 中,我得到保存的 textview 并在 UITableView 中显示。但是当我启动应用程序时,它会自动在索引 0 中显示“null”文本。

VC:

-(void)save:(id)sender

   NSUserDefaults *userData1 = [NSUserDefaults standardUserDefaults];
    [userData1 setObject:textView.text forKey:@"savetext"];
    [userData1 synchronize];

VC1:

-(void) viewWillAppear:(BOOL)animated

    [super viewWillAppear:animated];

     // textArray=[[NSMutableArray alloc]init];

    txt=[[UITextView alloc]initWithFrame:CGRectMake(0, 0, 320, 400)];

    NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
    // getting an NSString
     NSString *savedValue = [prefs stringForKey:@"savetext"];

    NSLog(@"saved is %@",savedValue);

    txt.text = [NSString stringWithFormat:@"%@", savedValue];

    NSLog(@"text.txt is %@", txt.text);

    MyAppDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];

  if(![MyAppDelegate.textArray containsObject:txt.text])
        [MyAppDelegate.textArray addObject:txt.text];
    

   NSUserDefaults *userData1 = [NSUserDefaults standardUserDefaults];
    [userData1 setObject:MyAppDelegate.textArray forKey:@"save"];
    [userData1 synchronize];


UITableView 使用数组显示文本值:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 

    NSMutableArray* myMutableArrayAgain = [NSMutableArray arrayWithArray:[[NSUserDefaults standardUserDefaults] objectForKey:@"save"]];

     NSLog(@"array is %@",myMutableArrayAgain);

     return [myMutableArrayAgain count];

  


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

    NSMutableArray* myMutableArrayAgain = [NSMutableArray arrayWithArray:[[NSUserDefaults standardUserDefaults] objectForKey:@"save"]];

    NSLog(@"mycell is %@",myMutableArrayAgain);

    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    NSLog(@"cell is %@",cell);

    if (cell == nil) 

        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease];

        NSLog(@"cell inside is %@",cell);

    

 // Configure the cell...
    cell.textLabel.text = [myMutableArrayAgain objectAtIndex:indexPath.row];
    [cell.textLabel setFont:[UIFont fontWithName:@"Arial-BoldMT" size:14]];
    cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;

    return cell;


【问题讨论】:

[myMutableArrayAgain objectAtIndex:0]返回什么对象?是NSNull吗? viewWillApear, [tableView reloadData]; 中将其添加为最后一行 @jszumski: [myMutableArrayAgain objectAtIndex:0] 为 NULL @samfisher:最后一行也不起作用 当我使用 [myMutableArrayAgain objectAtIndex:1] 由于未捕获的异常 'NSRangeException' 而终止应用程序时,原因:'*** -[__NSArrayM objectAtIndex:]:索引 1 超出范围 [0 .. 0] ' 【参考方案1】:

这都是因为代码有些地方不对:

1) 带有数组的 Nsmutable 数组是错误的:- 因为 userdefaults 正在返回一个字符串。 所以这样做:-

 NSUserDefaults *userData1 = [NSUserDefaults standardUserDefaults];
    NSMutableArray* myMutableArrayAgain = [NSMutableArray arrayWithObject:[userData1 valueForKey:@"savetext"]];

2) 在 VC 中,您将键的值保存在“savetext”中,但在 VC1 中,您将值检索为“save”,因此请更改它,它已在上面的代码中完成。

// 以上两点可以解决您的问题,但我会说不要这样编码,因为它会消耗更多内存并会消除代码的整洁性。您所做的代码可以以非常有效的方式完成。 我告诉你 。

// 获取第一个视图控制器 VC 并将 IBAction 添加到按钮和 textView 或 textField 中。 在 VC 中编写此代码:-

.h 文件

@interface demoViewController : UIViewController
    IBOutlet UITextField *txt1;


-(IBAction)getData:(id)sender;

.m 文件

//首先包含下一个你想要重定向的控制器的头文件假设XYZ

#import XYZ.h

-(IBAction)getData:(id)sender
    NSUserDefaults *userData1 = [NSUserDefaults standardUserDefaults];
    [userData1 setObject:txt1.text forKey:@"savetext"];
    demoViewController1 *demo=[[demoViewController1 alloc]initWithNibName:@"demoViewController1" bundle:nil];
    [self.navigationController pushViewController:demo animated:NO];

// 在 ViewDisLoad 或 ViewDidAppear 上使用第二个控制器,随心所欲

// 取一个全局 MuttableArray

NSMutableArray *myMutableArrayAgain;

//我在ViewDidload上写了这段代码在这里分配数组,因为MutableObject需要分配

 NSUserDefaults *userData1 = [NSUserDefaults standardUserDefaults];
    myMutableArrayAgain=[[NSMutableArray alloc]init];
    [myMutableArrayAgain addObject: [userData1 valueForKey:@"savetext"]];

// 现在表格查看方法

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 

    return [myMutableArrayAgain count];




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

    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    NSLog(@"cell is %@",cell);

    if (cell == nil) 

        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];

        NSLog(@"cell inside is %@",cell);    
    

    // Configure the cell...
    cell.textLabel.text = [myMutableArrayAgain objectAtIndex:indexPath.row];
    [cell.textLabel setFont:[UIFont fontWithName:@"Arial-BoldMT" size:14]];
    cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
    return cell;

// 应用这种方式,您可以用更少的代码以更好的方式完成任务。

【讨论】:

以上是关于UITableView 单元格在索引 0 中显示“null”值的主要内容,如果未能解决你的问题,请参考以下文章

UITableView 可重用的自定义单元格在子视图中显示错误的内容

UITableView 单元格在首次加载时未显示

iOS - 使 UITableView 与自定义单元格在按钮单击时可编辑

UITableView 自定义单元格在 iPad Storyboard 上不起作用,但在 iPhone 上起作用

uitableview 自定义单元格在向下滚动 uitableview 时丢失其内容

UITableView 单元格在调整大小后不响应输入