Я пытаюсь создать контроллер представления, который содержит одно табличное представление с настраиваемыми UITableViewCells в них, которые являются редактируемыми.Теперь, когда я создаю контроллер представления и нажимаю его по вызову [self.navigationController pushController:animated:]
, он обнаруживается очень хорошо, и я могу выкинуть его, когда нажимаю кнопку «назад» на навигационном контроллере.Когда я создаю его во второй раз, он хорошо отображается.Но когда я щелкаю его во второй раз, мое приложение падает со следующим кадром стека:
#0 0x01087a67 in objc_msgSend
#1 0x04b6afb0 in ??
#2 0x00f1edb5 in +[__NSArrayI __new::]
#3 0x00f21661 in -[NSArray initWithArray:range:copyItems:]
#4 0x00e89833 in -[NSArray initWithArray:copyItems:]
#5 0x00f1ac9d in -[__NSArrayM copyWithZone:]
#6 0x00e867ca in -[NSObject(NSObject) copy]
#7 0x0038a643 in -[UINavigationController viewControllers]
#8 0x0038b68c in -[UINavigationController _shouldBottomBarBeHidden]
#9 0x0038d6b7 in -[UINavigationController _hideOrShowBottomBarIfNeededWithTransition:]
#10 0x00388277 in -[UINavigationController _popViewControllerWithTransition:allowPoppingLast:]
#11 0x0038841e in -[UINavigationController popViewControllerAnimated:]
#12 0x00387856 in -[UINavigationController navigationBar:shouldPopItem:]
#13 0x0032a104 in -[UINavigationBar _popNavigationItemWithTransition:]
#14 0x00332751 in -[UINavigationBar _handleMouseUpAtPoint:]
#15 0x002f60d1 in -[UIWindow _sendTouchesForEvent:]
#16 0x002d737a in -[UIApplication sendEvent:]
#17 0x002dc732 in _UIApplicationHandleEvent
#18 0x0185ba36 in PurpleEventCallback
#19 0x00f07064 in __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__
#20 0x00e676f7 in __CFRunLoopDoSource1
#21 0x00e64983 in __CFRunLoopRun
#22 0x00e64240 in CFRunLoopRunSpecific
#23 0x00e64161 in CFRunLoopRunInMode
#24 0x0185a268 in GSEventRunModal
#25 0x0185a32d in GSEventRun
#26 0x002e042e in UIApplicationMain
#27 0x0000215e in main at main.m:25
Код для реализации StringEditorViewController:
Интерфейс
#import <UIKit/UIKit.h>
#pragma mark -
#pragma mark String Editor Delegate
@class StringEditorViewController;
@protocol StringEditorDelegate
- (void)stringEditorWillEndEditing:(StringEditorViewController *)c;
- (void)stringEditorDidEndEditing:(StringEditorViewController *)c;
@end
#pragma mark -
#pragma mark Public Interface
@interface StringEditorViewController : UIViewController
<UITableViewDelegate,
UITableViewDataSource> {
UITableView *mainTableView;
id <StringEditorDelegate> _delegate;
NSMutableArray *_strings;
}
#pragma mark Init
- (id)initWithStrings:(NSArray *)str delegate:(id <StringEditorDelegate>)del;
#pragma mark Properties
@property (nonatomic, retain) UITableView *mainTableView;
@property (nonatomic, assign) id <StringEditorDelegate> delegate;
- (void)setStrings:(NSArray *)ns;
- (NSArray *)strings;
@end
Реализация
#pragma mark -
#pragma mark Private Interface
@interface StringEditorViewController (PrivateMethods)
- (UIView *)createEditorViewWithTableView:(UITableView **)tv;
@end
#pragma mark -
#pragma mark Public Implementation
@implementation StringEditorViewController
#pragma mark Init and Dealloc
- (id)initWithStrings:(NSArray *)str delegate:(id <StringEditorDelegate>)del {
self = [super init];
if(self != nil) {
UITableView *tv;
UIView *newView = [self createEditorViewWithTableView:&tv];
self.mainTableView = tv;
self.view = newView;
//[newView release];
[self setDelegate:del];
[self setStrings:str];
}
return self;
}
- (void)dealloc {
[mainTableView release];
[_strings release];
[super dealloc];
}
#pragma mark Properties
@synthesize mainTableView;
@synthesize delegate=_delegate;
- (void)setStrings:(NSArray *)ns {
if(ns = nil) {
ns = [NSArray array];
}
if(_strings != ns) {
[_strings release];
_strings = [ns mutableCopy];
}
}
- (NSArray *)strings {
return [[_strings copy] autorelease];
}
#pragma mark Table View Data Source
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
return nil;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return [_strings count];
}
#pragma mark Private Methods
- (UIView *)createEditorViewWithTableView:(UITableView **)tv {
UIView *myView;
UITableView *myTableView;
CGRect viewFrame;
viewFrame = [[UIScreen mainScreen] applicationFrame];
myView = [[UIView alloc] initWithFrame:viewFrame];
myTableView = [[UITableView alloc] initWithFrame:viewFrame];
[myView addSubview:myTableView];
[myTableView setDelegate:self];
[myTableView setDataSource:self];
[myTableView autorelease];
if(tv) {
*tv = myTableView;
}
return myView;
}
@end
Я знаю, что не уведомляю своего делегата о том, что представление будет или действительно исчезло, и что я не заполняю UITableView, но этоне нужно реализовывать это прямо сейчас.
Если бы кто-то мог помочь мне с этим, я был бы очень рад.Заранее спасибо, ief2