更新-原因发现!...请阅读以下内容并提出解决方案:
在创建视频来显示此问题时,我发现了为什么会发生这种情况...
当创建新的VC实例时,原始detVC会丢失#imports
文件中@implementation DetailViewController
和.m
之间定义的所有控件/元素。
例:
我包括一个重新出现此问题的视频。如图所示,除UISegmentedControl
和UILabel
..以外的所有控件均起作用,这两个控件在DetailViewController.m
中均定义为:
#import "DetailViewController.h"
UISegmentedControl *sortcontrol;
UILabel *incrementLabel;
@implementation DetailViewController
视频链接-http://www.youtube.com/watch?v=2ABdK0LkGiA
我认为我们已经很接近了..等待答案!!
附注:我认为此信息足以使我们找到解决方案,但如果需要,我也可以共享代码。
早点:
我们的应用程序中有一个detailViewController(detVC),通常是从UITableViewController中“推入”。
现在,我们还实现了Push Notifications,它将在通知到达时“模态化”地呈现相同的detVC,这又可以在任何视图控制器上进行。
一切正常,直到显示detVC through通知,而detVC的另一个实例已经是活动视图控制器(之前通过TableView推送)。
当所提供的detVC被关闭时,将发生问题-推送的detVC“失去”了对所有内容的控制权-它指向的数据与以前不同,甚至在按任意索引时,导航工具栏上的
UISegmentedControl
都指向-1
索引!当我们创建单独的detVC实例时,为什么会发生这种情况?为什么会影响早期的detVC?如何解决/关于目标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
我有更多信息可能会导致原因。
如果我在
viewDidLoad
上像这样运行viewDidAppear
: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/