繁体   English   中英

重新排列UITableView时如何更新视图的内容?

[英]How do I update a view's content when a UITableView is rearranged?

这是我要完成的工作的摘要:

  • UIViewController是一个UITableViewController
  • 轻触单元格会将用户带到新的UIViewController ,他们可以在其中输入文本并将其保存
  • 用户可以预览保存在另一个UIViewController上的所有文本
  • 当用户在Main UIViewController重新排列表时,用户可以在Preview中看到更改

重新排列UITableViewController时,如何更改/移动Preview UIViewController上的文本?

任何通用的方法,技巧,教程,示例都非常感谢!

谢谢!

编辑,这是我的代码:

单例.h

 #import <Foundation/Foundation.h>

 @interface MyInformation : NSObject
 {
     NSMutableArray * informationArray;
     NSMutableString * nameString;
     NSMutableString * jobString;
 }

 @property (nonatomic, retain) NSMutableArray * informationArray;
 @property (nonatomic, retain) NSMutableString * nameString;
 @property (nonatomic, retain) NSMutableString * jobString;

 + (id)sharedInformation;

 @end

单例.m

 #import "MyInformation.h"

 @implementation MyInformation

 static MyInformation * _sharedMyInformation = nil;

 @synthesize informationArray = _informationArray;
 @synthesize nameString = _nameString;
 @synthesize jobString = _jobString;

 #pragma mark Singleton Methods

 + (id)sharedInformation
 {
     @synchronized(self)
     {
         if (_sharedMyInformation == nil)
         {
             _sharedMyInformation = [[self alloc] init];
         }   
     }
     return _sharedMyInformation;
 }

 - (id)init
 {
     if (self = [super init])
     {
         _nameString = [[NSMutableString alloc] init];
         _jobString = [[NSMutableString alloc] init];
         _informationArray = [[NSMutableArray alloc] initWithObjects:_nameString, _jobString, nil];

     }
     return self;
 }

 @end

ViewController.m

 - (void)viewDidLoad
 {
     [super viewDidLoad];

     if ([[UIScreen mainScreen] bounds].size.height == 568)
     {
         self.aTableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, 320, 1136) style:UITableViewStyleGrouped];
         self.aTableView.delegate = self;
         self.aTableView.dataSource = self;
         [self.view addSubview:self.aTableView];

         self.editBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Edit" style:UIBarButtonItemStylePlain target:self action:@selector(editButtonTapped)];
         self.navigationItem.rightBarButtonItem = self.editBarButtonItem;
     }
 }

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

     [self.aTableView reloadData];
 }

 - (void)editButtonTapped
 {
      if (self.editing)
      {
          [super setEditing:NO animated:NO];
          [self.aTableView setEditing:NO animated:NO];
          [self.aTableView reloadData];
          [self.editBarButtonItem setTitle:@"Edit"];
          [self.navigationItem.rightBarButtonItem setStyle:UIBarButtonItemStylePlain];
       }
       else
       {
          [super setEditing:YES animated:YES];
          [self.aTableView setEditing:YES animated:YES];
          [self.aTableView reloadData];
          [self.editBarButtonItem setTitle:@"Done"];
          [self.editBarButtonItem setStyle:UIBarButtonItemStyleDone];
       }
   }

  - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
  {
      return 2;
  }

  - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
  {
      MyInformation * myInformation = [MyInformation sharedInformation];
      int count = [myInformation.informationArray count];

      if (section == 0)
      {
          return count;
      }
      else if (section == 1)
      {
          return 1;
      }

      return count;
  }

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

     UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

      if (cell == nil)
      {
          cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
      }

     MyInformation * myInformation = [MyInformation sharedInformation];

     if (indexPath.section == 0 && indexPath.row == 0)
     {
         cell.textLabel.text = [NSString stringWithFormat:@"%@", myInformation.nameString];
         cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
     }

     if (indexPath.section == 0 && indexPath.row == 1)
     {
         cell.textLabel.text = [NSString stringWithFormat:@"%@", myInformation.jobString];
         cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
     }

     if (indexPath.section == 1 && indexPath.row == 0)
     {
         cell.textLabel.text = @"Preview";
         cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
     }

     return cell;
 }

 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
 {
     [tableView deselectRowAtIndexPath:indexPath animated:YES];

      if (indexPath.section == 0 && indexPath.row == 0)
      {
         NameViewController * name = [[NameViewController alloc] initWithNibName:@"NameViewController" bundle:nil];
         [self.navigationController pushViewController:name animated:YES];
      }

     if (indexPath.section == 0 && indexPath.row == 1)
     {
         JobViewController * job = [[JobViewController alloc] initWithNibName:@"JobViewController" bundle:nil];
         [self.navigationController pushViewController:job animated:YES];    
     }

     if (indexPath.section == 1 && indexPath.row == 0)
     {
         PreviewViewController * preview = [[PreviewViewController alloc] initWithNibName:@"PreviewViewController" bundle:nil];
          [self.navigationController pushViewController:preview animated:YES];
    }
 }


 - (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath
 {
     MyInformation * myInformation = [MyInformation sharedInformation];

     NSString * item = [myInformation.informationArray objectAtIndex:sourceIndexPath.row];
     [myInformation.informationArray removeObjectAtIndex:sourceIndexPath.row];
     [myInformation.informationArray insertObject:item atIndex:destinationIndexPath.row];
 }

 - (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath
 {
     if (indexPath.section == 0 )
     {
         return YES;
     }   
     else
     {
         return NO;  
     }
 }
 @end

编辑2:

我不相信我的阵列正在更新。

这是我的保存代码的示例:

 - (IBAction)saveButtonTapped
 {
     MyInformation * myInformation = [MyInformation sharedInformation];

     if (_nameTextField.text == nil)
     {
         myInformation.nameString = @"";
     } 
     else
     {
         [myInformation.nameString setString:@""];
         [myInformation.nameString appendFormat:@"%@", _nameTextField.text];
     }

     [self.navigationController popToRootViewControllerAnimated:YES];
 }

在此日志中,nameString确实更新为我键入并保存的任何文本。

但是我的informationArray总是返回为(“”,“”)

编辑3和4:

用设置的字符对单例中的字符串进行硬编码。

现在我可以重新整理桌子了,这很好。

下面是更新的代码。 重新排列表格时,预览页上的标签将重新排列。

这是代码:

 - (void)viewDidLoad
 {
     [super viewDidLoad];

     MyInformation * myInformation = [MyInformation sharedInformation];

     _nameLabel = [[UILabel alloc] init];
     _nameLabel.frame = CGRectMake(20, 20, 300, 44);
     _nameLabel.text = [NSString stringWithFormat:@"%@", [myInformation.informationArray objectAtIndex:0]];

     _jobLabel = [[UILabel alloc] init];
     _jobLabel.frame = CGRectMake(50, 50, 300, 44);
     _jobLabel.text = [NSString stringWithFormat:@"%@", [myInformation.informationArray objectAtIndex:1]];

     [self.view addSubview:_nameLabel];
     [self.view addSubview:_jobLabel];
 }

编辑5:

剩下要做的唯一事情就是如何更新单例和UITableViewCells中的字符串中的文本?

编辑6:

我解决了这个问题。 我不得不将Singleton中的字符串更改为NSMutableStrings。 我修改了保存按钮代码,将字符串设置为空值,并将其附加到文本字段文本中。 此后,它现在可以正常工作了!

感谢您的帮助和建议!

我假设您有NSMutableArray的支持,但是答案应该概括为任何数据存储方案。

  1. 使用tableView:moveRowAtIndexPath:toIndexPath:来检测用户何时重新排序第一个表并通过从fromIndexPath.row删除对象并将其插入toIndexPath.row更新后备数组。 这可以确保您的支持模型准确反映用户刚刚在UI中所做的更改。

  2. 当用户移至预览视图时,该视图要么需要从相同的共享数据源(我们在#1中修改过的数据源)中提取,要么需要获得刚刚重新排列的数组的副本。 后一种情况更简单,可以通过在预览控制器上添加NSArray属性来完成: @property(nonatomic, copy) NSArray *itemsToPreview 然后,确保预览控制器使用该数组而不是原始数组。

Apple的有关对表视图重新排序的文档是一个很好的资源。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM