Как установить parentViewController в UIViewController?

Вращение памяти может быть проблемой здесь, начиная с каждой упаковки интервала, больше, чем, или равняться 128 причинам объектному выделению (см. Integer.valueOf (интервал)). Хотя сборщик "мусора" очень эффективно имеет дело с недолгими объектами, производительность пострадает до некоторой степени.

, Если Вы знаете, что количество инкрементов составило завещание в основном, превосходят численностью количество ключей (=words в этом случае), рассматривают использование международного держателя вместо этого. Phax уже представил код для этого. Здесь это снова с двумя изменениями (класс держателя, сделанный набором статического и начального значения к 1):

static class MutableInt {
  int value = 1;
  void inc() { ++value; }
  int get() { return value; }
}
...
Map map = new HashMap();
MutableInt value = map.get(key);
if (value == null) {
  value = new MutableInt();
  map.put(key, value);
} else {
  value.inc();
}

при необходимости в экстремальной производительности ищите Реализацию Map, которая непосредственно адаптируется к примитивным типам значения. jrudolph упомянул Находка GNU .

Между прочим, хороший критерий поиска для этого предмета является "гистограммой".

14
задан mrueg 7 September 2009 в 21:39
поделиться

5 ответов

Однако, поскольку он доступен только для чтения, и я не нашел другого способа установить это свойство, мой вопрос: как мне установить его?

Если это только для чтения , вы не можете использовать точечную нотацию, не получив ошибки компилятора .

Однако вы можете использовать категории , чтобы добавить пользовательский modifyParentViewController в класс UIViewController .

Даже если свойство доступно только для чтения, сама переменная может быть изменена, если она не @protected . Если это @protected , создание подкласса контроллера представления может позволить вам изменить переменную.

0
ответ дан 1 December 2019 в 12:27
поделиться

parentViewController предназначен для целей NavigationViewControllers и представления контроллеров модального представления. Невозможно установить свойство без методов pushViewController или presentModalViewController.

0
ответ дан 1 December 2019 в 12:27
поделиться

Я попробовал предложение Алекса купить, сделав категорию для UIViewController, и он работал в симуляторе, но не на моем телефоне. вот категория

@interface UIViewController (parentSetter) 
-(void)setParentUIViewController:(UIViewController*)parent;
@end

@implementation UIViewController (parentSetter)
-(void)setParentUIViewController:(UIViewController*)parent
{
 _parentViewController = parent;
}
@end

Он компилируется и работает хорошо, но обратите внимание на подчеркивание член, который немного не откладывает. Вот что вызывает ошибку компоновщика при компиляции с 3.0 SDK.

У меня есть вид контейнера, который имеет 2 витрины, а таблица - одна из них. Таблице нужен родитель, чтобы она могла, помимо всего прочего, взаимодействовать с навигационной панелью.

Вместо этого я предлагаю следующее решение:

@interface AdoptedTableViewController : UITableViewController {
    UIViewController* surrogateParent;
}

-(UINavigationController*)navigationController;
@property (nonatomic, assign) IBOutlet UIViewController *surrogateParent;
@end

@implementation AdoptedTableViewController
@synthesize surrogateParent;

-(UINavigationController*)navigationController
{
    if( [super navigationController] )//self.navigationController ) 
    {
        return [super navigationController];
    }
    else
    {
        return surrogateParent.navigationController;
    }
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    [tableView deselectRowAtIndexPath:indexPath animated:YES];
}

Все мои контроллеры представления таблиц теперь являются контроллерами TableViewControllers. Основная причина, по которой им нужны родители, заключается в том, что они могут подталкивать контроллеры просмотра к навигационному стеку, так что это прозрачно обрабатывается получателем контроллера навигации.

Было бы неплохо, если бы parentViewController не только читался, но и в моей работе с _parentViewController я обнаружил, что в иерархии ViewController есть нечто большее, чем просто это свойство. Я думаю, что может быть много связи и обязанностей в этих отношениях, что Apple не очистила достаточно для масс. Например, я заметил странное поведение при отборе при перемещении вверх по иерархии навигации, которое я не смог исправить. Может быть, контроллеры UINavigation отражают класс своего верхнего контроллера и ведут себя по-другому?

Короче говоря, на самом деле они только для чтения, и нет никакого чистого или простого обходного пути. Нужно просто обдумать это.

2
ответ дан 1 December 2019 в 12:27
поделиться

Похоже, вызов метода setParentViewController: работает.

[childViewController setParentViewController:self];

Однако это все равно генерирует предупреждение компилятора. Что, IMO, означает, что не делайте этого (вместо этого я выделил подклассы).

0
ответ дан 1 December 2019 в 12:27
поделиться

Решение:

   - (void)setParentController:(UIViewController*)parent{
 [self setValue:parent forKey:@"_parentViewController"];
    }

Не вызывает проблем с компоновщиком!

PS: Не используйте "setParentViewController" в качестве имени метода, потому что этот метод существует в частном API, и Apple сообщает: "В ваше приложение включен закрытый API-интерфейс setParentViewController :.

Если вы определили метод в исходном коде с тем же именем, что и упомянутый выше API, мы предлагаем изменить имя вашего метода, чтобы оно больше не конфликтовало с частным API Apple, чтобы ваше приложение не было помечено при отправке в будущем.

Пожалуйста, решите эту проблему в следующем обновлении ... "

11
ответ дан 1 December 2019 в 12:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: