我正在尝试构建一个iOS应用程序,我在其中创建了一个自定义标签栏: 在UIView中,我有不同的按钮在同一个视图控制器中加载UIView的内容。
在某些视图中,我插入了一个UITableView。表格加载正常,所有单元格都正确打印,但滚动时我得到一个EXC_BAD_ACCESS错误。 我启用僵尸获取更多信息,我收到以下消息: “FirstTabBarController responsToSelector”:消息发送到解除分配的实例0x75d79d0
我无法弄清楚如何解决这个问题。
以下是有关应用程序结构的更多信息: 在MainViewController中,我有一个UIView,它从不同的UIViewControllers获取数据以加载内容以复制tabbar:
.h文件:
#import <UIKit/UIKit.h>
@interface MainViewController : UIViewController
@property (weak, nonatomic) IBOutlet UIView *placeholderView;
@property (weak, nonatomic) UIViewController *currentViewController;
@end
当我使用自定义segue加载我的FirstTabBarViewController时,我得到的表不会滚动:
#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
.m文件:
#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。 自定义segue的行为如下:
#import "customTabBarSegue.h"
#import "MainViewController.h"
@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];
}
@end
非常感谢你的帮助,非常感谢。
答案 0 :(得分:0)
替换以下方法:
- (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;
}
使用以下方法:
- (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 = [[NSString alloc] initWithString:@"%@",[self.messageDataController objectInListAtIndex:indexPath.row]];
[[cell textLabel] setText:expenseAtIndex];
return cell;
}
我希望这会对你有所帮助。
答案 1 :(得分:0)
@Arnuad
正如我在上一篇文章中所述,TableView超出了范围,这就是确切的情况。 我找到了一个解决方案,它的工作非常好。
在 customTabBarSegue 文件中,在执行方法的末尾编写以下代码:
dst.dashboardTable.delegate = src;
dst.dashboardTable.dataSource = src;
并在 MainViewController
中实现数据源和委托方法希望这会对你有所帮助。
答案 2 :(得分:0)
@Arnuad
找到另一个更好的解决方案。
只需在 MainViewController 中将 currentViewController 的属性设为强而不是弱。
答案 3 :(得分:0)
检查您是否将标签栏控制器设置为应用程序委托中的UIWindow的rootViewController。否则它可能不会被保留,并且在didFinishLaunching之后它将被释放导致EXC_BAD_ACCESS。
我看到人们使用过时的模板用于仍然具有旧变体的项目,他们只将标签栏控制器的视图添加到窗口。自iOS 6以来,这不再起作用了。