我正在使用自定义栏标签构建一个简单的应用,该标签会从位于另一个ViewController
的{{1}}加载UITableView
的内容。
但是,每次我尝试滚动tableview时,都会出现ViewController
错误。我启用了exc_bad_access
并保护malloc以获取有关该问题的更多信息。
在控制台中我得到:
NSzombies
在分析后我得到:
"message sent to deallocated instance 0x19182f20"
以下是发生错误的ViewController的一些代码: .h文件:
# Address Category Event Type RefCt Timestamp Size Responsible Library Responsible Caller
56 0x19182f20 FirstTabBarViewController Zombie -1 00:16.613.309 0 UIKit -[UIScrollView(UIScrollViewInternal) _scrollViewWillBeginDragging]
.m文件:
#import <UIKit/UIKit.h>
#import "DataController.h"
@interface FirstTabBarViewController : UIViewController <UITableViewDelegate, UITableViewDataSource> {
IBOutlet UITableView* tabBarTable;
}
@property (strong, nonatomic) IBOutlet UIView *mainView;
@property (strong, nonatomic) IBOutlet UITableView *tabBarTable;
@property (nonatomic, strong) DataController *messageDataController;
@end
这个FirstTabBarViewController在MainViewController中加载,带有以下自定义segue:
#import "FirstTabBarViewController.h"
#import "DataController.h"
@interface FirstTabBarViewController ()
@end
@implementation FirstTabBarViewController
@synthesize tabBarTable=_tabBarTable;
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// Custom initialization
}
return self;
}
- (void)viewDidLoad
{
[super viewDidLoad];
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
- (void)awakeFromNib
{
[super awakeFromNib];
self.messageDataController=[[DataController alloc] init];
}
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return 1;
}
- (NSInteger) tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
return [self.messageDataController countOfList];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"mainCell";
UITableViewCell *cell = [tableView
dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil){
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
};
NSString *expenseAtIndex = [self.messageDataController
objectInListAtIndex:indexPath.row];
[[cell textLabel] setText:expenseAtIndex];
return cell;
}
- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath
{
// Return NO if you do not want the specified item to be editable.
return NO;
}
@end
Datacontroller类只是一个包含字符串的简单NSMutableArray。
我正在使用ARC,所以我不明白内存管理错误的来源。有人有线索吗?
任何帮助非常感谢;) 谢谢!!
答案 0 :(得分:0)
好的...感谢您提供代码示例......
请参阅UIStoryboardSegue documentation,当您在perform
中实施customTabBarSegue
时,您有责任最终在您的2之间设置正确的关系 viewControllers。
你有两种可能性:
将dst设置为模态子项(然后src为dst的presentingViewController
),在perform
末尾添加此代码:[src presentViewController:dst animated:NO completion:nil];
将dst设置为src的子viewController - 添加此代码:[src addChildViewController:dst];
在perform
的末尾,但是,你必须在某个地方删除它,或者以相同的方法移除其他子节点....
这是一个实现
@implementation customTabBarSegue
-(void) perform {
MainViewController *src= (MainViewController *) [self sourceViewController];
UIViewController *dst=(UIViewController *)[self destinationViewController];
for (UIView *view in src.placeholderView.subviews){
[view removeFromSuperview];
}
src.currentViewController =dst;
[src.placeholderView addSubview:dst.view];
// this container only show 1 viewController at a time, so we can remove previous ones
for (UIViewController *vc in src.childViewControllers) {
[vc.view removeFromSuperview];
[vc removeFromParentViewController];
}
//then add the new View controller as child
[src addChildViewController:dst];
}
@end
无论如何,你应该明确地看一下UIViewController包含......