gpt4 book ai didi

objective-c - 在 iOS 5 中将数据从 TableView 传递到 Detail ViewController 时出现问题

转载 作者:可可西里 更新时间:2023-11-01 05:31:32 25 4
gpt4 key购买 nike

我将不胜感激任何帮助解决我在最后一天拔头发的问题!

免责声明 1 我是一个 Objective-C 菜鸟 - 所以这个问题的答案可能非常简单(我有多年的 PHP 经验)。请友善。

免责声明 2 是的,我已经广泛地“谷歌搜索”并查看了 Apple 文档 - 但未能理解我的问题。

总结

我正在尝试将 TableView 中选择的值从单例传递给另一个 Controller 。我发现第二个 View Controller 中的 viewDidLoad 方法在触发 segue 的 tableView: didSelectRowAtIndexPath: 方法之前完成。这导致第二个 View Controller 访问“陈旧”数据。

细节

我已经使用面向 iOS5 的 ARC 使用非常简单的 StoryBoard 设置了一个项目。

StoryBoard

我创建了一个单例来在 View Controller 之间存储 NSString。

Singleton.h

#import <Foundation/Foundation.h>
@interface Singleton : NSObject
@property (strong, nonatomic) NSString *sharedString;
+ (id)singletonManager;
@end

单例.m

#import "Singleton.h"

static Singleton *sharedInstance = nil;

@implementation Singleton
@synthesize sharedString = _sharedString;
+(id)singletonManager
{
@synchronized(self){
if (sharedInstance == nil)
sharedInstance = [[self alloc] init];
}
return sharedInstance;
}
-(id) init {
if (self = [super init]) {
_sharedString = [[NSString alloc] initWithString:@"Initialization String"];
}
return self;
}

@end

Story board 中的TableView 链接到下面的TableViewController

TableViewController.h

#import <UIKit/UIKit.h>

@interface TableViewController : UITableViewController
@end

TableViewController.m

#import "TableViewController.h"
#import "Singleton.h"

@interface TableViewController ()
@property NSArray *tableData;
@end

@implementation TableViewController
@synthesize tableData;

- (id)initWithStyle:(UITableViewStyle)style
{
self = [super initWithStyle:style];
if (self) {
}
return self;
}

- (void)viewDidLoad
{

[super viewDidLoad];
self.tableData = [NSArray arrayWithObjects:@"First", @"Second", @"Third", nil];
}

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


- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
// Return the number of sections.
return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
// Return the number of rows in the section.
return [self.tableData count];
}

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

// Configure the cell...
cell.textLabel.text = [self.tableData objectAtIndex:indexPath.row];
return cell;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
NSLog(@"TableViewController: didSelectRowAtIndexPath start");
Singleton *sharedInstance = [Singleton singletonManager];
sharedInstance.sharedString = [self.tableData objectAtIndex:indexPath.row];
NSLog(@"TableViewController: Finished storing data into shared string: %@", sharedInstance.sharedString);
NSLog(@"TableViewController: didSelectRowAtIndexPath start");
}

@end

表格单元格被转换(推送)到具有单个标签的基本 ViewController。

DetailViewController.h

#import <UIKit/UIKit.h>

@interface DetailViewController : UIViewController
@property (strong, nonatomic) IBOutlet UILabel *displayLabel;

@end

DetailViewController.m

#import "DetailViewController.h"
#import "Singleton.h"

@interface DetailViewController ()

@end

@implementation DetailViewController
@synthesize displayLabel = _displayLabel;

- (void)viewDidLoad
{
[super viewDidLoad];
NSLog(@"DetailViewController: viewDidLoad start");
Singleton *sharedInstance = [Singleton singletonManager];
self.displayLabel.text = sharedInstance.sharedString;
NSLog(@"displayLabel.text: %@", self.displayLabel.text);
NSLog(@"DetailViewController: viewDidLoad end");
}

- (void)viewDidUnload
{
[self setDisplayLabel:nil];
[super viewDidUnload];
}

@end

当一个表格单元格被选中时,我想要

  • 在共享单例 NSString 中设置值的 TableViewController
  • 开始转到详细 View
  • DetailViewController 获取共享单例 NSString 中的值并将其显示在标签中
  • 要呈现到屏幕的详细 View

不幸的是,我的代码没有按预期工作。如果我查看控制台中的 NSLog 详细信息,我可以看到详细 View 的 viewDidLoad 函数实际上在启动 TableView 方法 (didSelectRowAtIndexPath) 之前完成。

2012-05-10 23:17:45.756 TestSingleton[12105:f803] DetailViewController: viewDidLoad start
2012-05-10 23:17:45.758 TestSingleton[12105:f803] displayLabel.text: Initialization String
2012-05-10 23:17:45.759 TestSingleton[12105:f803] DetailViewController: viewDidLoad end
2012-05-10 23:17:45.763 TestSingleton[12105:f803] TableViewController: didSelectRowAtIndexPath start
2012-05-10 23:17:45.764 TestSingleton[12105:f803] TableViewController: Finished storing data into shared string: First
2012-05-10 23:17:45.765 TestSingleton[12105:f803] TableViewController: didSelectRowAtIndexPath start

啊啊啊!

如果我将标签文本的设置放在详细 View 的 viewDidAppear 方法中,将显示来自共享单例 NSString 的正确值。但是,使用这种方法,您实际上可以看到应用程序更改了文本标签的值(例如,如果您单击第一行,当详细 View 屏幕加载时,您可以看到标签从“初始化字符串”更改为“第一个” ").

有人可以解释一下我如何将共享值从单例传递到另一个 View ,并在 View 实际呈现到屏幕之前将它提供给第二个 View Controller

如果需要任何说明 - 请告诉我。

我确信这与我未能理解 View 生命周期的微妙之处有关。

更新

感谢 *8vius。

我在 TableViewController.m 中的新方法解决了我的问题:

- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if([segue.identifier isEqualToString:@"mySegue"]) {
NSLog(@"Preparing for Segue to detail view");
Singleton *sharedInstance = [Singleton singletonManager];
NSIndexPath *selectedRow = [self.tableView indexPathForSelectedRow];
sharedInstance.sharedString = [self.tableData objectAtIndex:selectedRow.row];
NSLog(@"TableViewController: Finished storing data into shared string: %@", sharedInstance.sharedString);

}
}

最佳答案

在您的目标 View Controller 中设置一个属性(公共(public)),以便您可以设置您希望传入的值。在您的原始 View Controller 中实现 prepareForSegue 并导入目标 View Controller 的 header .

要获取 TableView 单元格的 indexPath,您应该为 TableView 设置一个 IBOutlet,这样您就可以在 prepareForSegue 方法中使用 indexPathForCell 方法获取 indexPath。

在你的 prepareForSegue 中你应该有这样的东西:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
NSIndexPath *indexPath = [self.tableView indexPathForCell:sender];
if ([segue.identifier isEqualToString:@"[identifier for your segue]"]) {
[segue.destinationViewController setValueIWantToSet:value];
}
}

如果您愿意,您也可以在此处设置标签文本的值。

你的 viewDidLoad 之前完成的原因是因为 iOS 在转换到它之前设置了目标 View Controller ,使用 prepareForSegue 方法保证你的目标 View Controller 已经实例化并设置,这样您就可以设置您想要的值。

关于objective-c - 在 iOS 5 中将数据从 TableView 传递到 Detail ViewController 时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10535606/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com