Прежде всего, слава Богу за переполнение стека.Я новичок в разработке Objective-C / Cocoa / iPhone, и этот сайт очень полезен.
У меня есть окно с панелью вкладок, в котором есть контроллер навигации, который загружает UITableViewController.Нажатие кнопки «Добавить» на панели навигации (созданной программно) вызывает UITableViewController следующим образом:
InvoiceAddViewController *addController = [[InvoiceAddViewController alloc] initWithNibName:@"InvoiceAddViewController" bundle:[NSBundle mainBundle]];
[self.navigationController pushViewController:addController animated:YES];
Этот контроллер табличного представления выдвигает свой собственный подробный вид:
UITableViewCell *targetCell = [self.tableView cellForRowAtIndexPath:indexPath];
GenericTextFieldDetailViewController *dvController = [[GenericTextFieldDetailViewController alloc] initWithNibName:@"GenericTextFieldDetailViewController" bundle:[NSBundle mainBundle]];
dvController.fieldName = targetCell.textLabel.text;
dvController.fieldValue = targetCell.detailTextLabel.text;
[self.navigationController pushViewController:dvController animated:YES];
[dvController release];
В принципе, вы нажимаете на ячейку в контроллере табличного представления, например «Заметки».Это выдвигает «GenericTextFieldDetailViewController» с именем «поля», которое вы щелкнули, и значением (если оно уже существует).Это позволяет мне повторно использовать мой подробный вид, а не создавать один рекламный тошнот для каждого поля.
Чтобы отодвинуть данные назад, я создал метод на «Add» UITableViewController:
- (void) updateField:(NSString*) fieldName value:(NSString*) fieldValue
{
UITableViewCell *targetCell;
if([fieldName isEqualToString:@"Invoice ID"])
{
NSUInteger indexArr[] = {1,1};
targetCell = [[self tableView] cellForRowAtIndexPath:[NSIndexPath indexPathWithIndexes:indexArr length:2]];
targetCell.detailTextLabel.text = fieldValue;
}
else if([fieldName isEqualToString:@"P.O. Number"])
{
NSUInteger indexArr[] = {1,2};
targetCell = [[self tableView] cellForRowAtIndexPath:[NSIndexPath indexPathWithIndexes:indexArr length:2]];
targetCell.detailTextLabel.text = fieldValue;
}
else if([fieldName isEqualToString:@"Add Note"])
{
NSUInteger indexArr[] = {3,0};
targetCell = [[self tableView] cellForRowAtIndexPath:[NSIndexPath indexPathWithIndexes:indexArr length:2]];
targetCell.detailTextLabel.text = fieldValue;
}
}
Этот метод предназначен для получения данных, которые я отправляю с помощью этого метода в «Универсальный»:
- (IBAction)saveField:(id)sender
{
self.fieldValue = theTextField.text;
InvoiceAddViewController *parentController = (InvoiceAddViewController*)self.view.superview;
[parentController updateField:self.fieldName value:self.fieldValue];
}
Что приводит нас к проблеме: когда метод сохранения срабатывает, он выдает неверную ошибку селектора, потому что self.view.superview - это не UITableView, который выдвинул подробное представление «Generic».
Я пробовал следующие комбинации (из GDB):
(gdb) po [[self view] superview]
<UIViewControllerWrapperView: 0x4b6d4d0; frame = (0 64; 320 367); autoresize = W+H; layer = <CALayer: 0x4b6c090>>
(gdb) po [[self navigationController] parentViewController]
<UITabBarController: 0x4d2fa90>
(gdb) po [self parentViewController]
<UINavigationController: 0x4d2fdc0>
Я чувствую, что приземляюсьвсе вокруг UITableView я хочу вызвать, но не могу найти его.
Что я делаю не так?
воздерживается от того, чтобы вырывать больше волос