gpt4 book ai didi

iphone - 为什么 ViewController 类的单独实例会影响前一个实例?

转载 作者:行者123 更新时间:2023-11-29 04:50:53 25 4
gpt4 key购买 nike

更新 - 已找到原因!...请阅读以下内容并提出解决方案:

在创建视频来展示此问题时,我发现了为什么会发生这种情况......

.m 文件中的 #imports@implementation DetailViewController 之间定义的任何控件/元素都会被原始 detVC 丢失。 VC 创建了新实例。

示例:我提供了一个重现此问题的视频。如图所示,除了 UISegmentedControlUILabel 之外,所有控件都可以工作。这两个控件在 DetailViewController.m 中定义为:

#import "DetailViewController.h"

UISegmentedControl *sortcontrol;
UILabel *incrementLabel;

@implementation DetailViewController

视频链接 - http://www.youtube.com/watch?v=2ABdK0LkGiA

我认为我们已经非常接近了..等待答案!!

P.S.:我认为这些信息足以引导我们找到解决方案,但如果需要,我也可以共享代码。

<小时/>

之前:

我们的应用程序中有一个DetailViewController (detVC),它通常是从UITableViewController“推送”的。

现在我们还实现了推送通知,只要通知到达,它就会“模态”地呈现相同的 detVC,而这又可以在任何 View Controller 上发生。

一切正常,直到通过通知呈现 detVC,而 detVC 的另一个实例已经是事件 View Controller (之前通过 TableView 推送)。

当所呈现的 detVC 被忽略时,就会出现问题 - 推送的 detVC “失去”对所有内容的控制 - 它没有指向与之前相同的数据,甚至导航工具栏上的 UISegmentedControl 也指向-1 按任意索引即可索引!

为什么当我们创建一个单独的 detVC 实例时会发生这种情况?为什么它会影响早期的 detVC?怎么解决/这里需要学习Objective C什么? (仅供引用,我们在项目中使用 ARC)

谢谢

<小时/>

编辑 - 一些代码:

按下时:

ProductDetailViewController *detailViewController = [[ProductDetailViewController alloc] init];    
detailViewController.hidesBottomBarWhenPushed = YES;
[self.navigationController pushViewController:detailViewController animated:YES];
detailViewController.serverOffset=serverOffset;
detailViewController.prdctIndex = indexPath.row;

通过通知呈现时:

- (void)displaySingleProduct:(NSDictionary*)userInfo{
ProductDetailViewController *onePrdVC = [[ProductDetailViewController alloc] init];
UINavigationController *addNav = [[UINavigationController alloc] initWithRootViewController:onePrdVC];
onePrdVC.justOne=YES;
onePrdVC.onePrdIDtoLoad=[[[userInfo valueForKey:@"prd"] valueForKey:@"id"] intValue];
[self.navigationController presentModalViewController:addNav animated:YES];
}

detVC 中有一个 Product 类,它从 SQLite 表中 prdctIndex 行存储的值中获取数据。

通过通知关闭所呈现的 detVC 后,推送的 detVC 的 Product 类开始指向所呈现的 detVC 中用于 Product 类的行。并且 viewDidAppear 中没有这样的代码会改变 Product 类。

所以,上面提到的这个 UISegmentedControl 问题和其他一些问题导致了痛苦!基本上,整个 detVC 的行为很奇怪 - 如果我们只是弹出并重新推送它,它就会重新工作!

<小时/>

编辑2

我有更多可能导致此问题的信息。如果我像这样在 viewDidAppear 上运行 viewDidLoad:

if (!justOne) {
aProduct = [allProducts getProduct:(prdctIndex+1) one:NO];
[self viewDidLoad];
[self populateDetails];
}

插入的 detVC 重新获得控制权并且每个元素/控件开始按预期重新工作(但不是以理想的方式)。因此,很明显,所提供的 detVC 的单独实例确实弄乱了之前推送的 detVC,并且需要通过 viewDidLoad 重新设置所有控件/指针。

从这些信息中可以得出任何有用的结论吗?

最佳答案

当您在代码中编写时:

#import "DetailViewController.h"

UISegmentedControl *sortcontrol;
UILabel *incrementLabel;

@implementation DetailViewController

您没有将这些变量定义为实例变量 (ivars),因此它们对于每个实例来说并不是单独的。定义 ivars 有三种方法。1) 传统方式,在 .h 文件中。

@interface DetailViewController{
UISegmentedControl *sortcontrol;
UILabel *incrementLabel;
}

2) Objective-C 的一些补充增加了对接下来两种方式的支持。就像在 .m 文件中声明它们一样。

@implementation DetailViewController{
UISegmentedControl *sortcontrol;
UILabel *incrementLabel;
}

3) 如果这些 ivars 使用属性来公开它们,那么您可以简单地省略它们的显式定义。所以在 .h 中:

@interface DetailViewController
@property (strong, nonatomic) IBOutlet UISegmentedControl *sortcontrol;
@property (strong, nonatomic) IBOutlet UILabel *incrementLabel;

然后在.m文件中:

@implementation DetailViewController
@synthesize sortcontrol;
@synthesize incrementLabel;

关于iphone - 为什么 ViewController 类的单独实例会影响前一个实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8872060/

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