Как я могу вытолкать представление от UINavigationController и заменить его другим в одной операции?

Вот что я нашел googling вокруг:

var fileupload = require("express-fileupload");

Который довольно простой механизм для загрузки

app.post("/upload", function(req, res)
{
    var file;

    if(!req.files)
    {
        res.send("File was not found");
        return;
    }

    file = req.files.FormFieldName;  // here is the field name of the form

    file.mv("file.txt", function(err)  //Obvious Move function
        {
              // log your error
        });

    res.send("File Uploaded");


});
83
задан Shekhar Gupta 20 August 2013 в 06:34
поделиться

5 ответов

После большого усилия (и тонкая настройка кода от Kevin), я наконец выяснил, как сделать это в контроллере представления, который выталкивается от стека. Проблема, которую я имел, состояла в том, что self.navigationController возвращал ноль после того, как я удалил последний объект из массива контроллеров. Я думаю, что это происходило из-за этой строки в документации для UIViewController на методе экземпляра navigationController, "Только возвращает контроллер навигации, если контроллер представления находится в своем стеке".

я думаю, что, как только контроллер текущего представления удален из стека, его navigationController метод возвратит ноль.

Вот скорректированный код, который работает:

UINavigationController *navController = self.navigationController;
MyEditViewController *mevc = [[MYEditViewController alloc] initWithGizmo: gizmo];

NSMutableArray *controllers = [[self.navigationController.viewControllers mutableCopy] autorelease];
[controllers removeLastObject];
navController.viewControllers = controllers;
[navController pushViewController:mevc animated: YES];
7
ответ дан 24 November 2019 в 08:46
поделиться

На основе опыта Вы оказываетесь перед необходимостью играть со свойством UINavigationController's viewControllers непосредственно. Что-то вроде этого должно работать:

MyEditViewController *mevc = [[MYEditViewController alloc] initWithGizmo: gizmo];

[[self retain] autorelease];
NSMutableArray *controllers = [[self.navigationController.viewControllers mutableCopy] autorelease];
[controllers removeLastObject];
self.navigationController.viewControllers = controllers;
[self.navigationController pushViewController:mevc animated: YES];

Примечание: Я изменил сохранение/выпущение на сохранение/автовыпущение, поскольку это просто обычно более устойчиво - если исключение произойдет между сохранением/выпущением, то Вы просочитесь сам, но автовыпуск заботится об этом.

9
ответ дан Lily Ballard 24 November 2019 в 08:46
поделиться

Этот UINavigationController метод экземпляра мог бы работать...

контроллеры представления Pops, пока указанный контроллер представления не является контроллером вида сверху и затем обновляет дисплей.

- (NSArray *)popToViewController:(UIViewController *)viewController animated:(BOOL)animated
1
ответ дан Maulik 24 November 2019 в 08:46
поделиться

Я обнаружил, что вам вообще не нужно вручную вмешиваться в свойство viewControllers . По сути, здесь есть две хитрости:

  1. self.navigationController вернет nil , если self в данный момент отсутствует в стеке контроллера навигации. Поэтому сохраните его в локальной переменной, прежде чем терять к нему доступ.
  2. Вы должны сохранить (и правильно освободить ) self или объект, которому принадлежит Метод, которым вы находитесь, будет освобожден, что вызовет странность.

После того, как вы выполните эту подготовку, просто хлопайте и нажимайте как обычно. Этот код мгновенно заменит верхний контроллер другим.

// locally store the navigation controller since
// self.navigationController will be nil once we are popped
UINavigationController *navController = self.navigationController;

// retain ourselves so that the controller will still exist once it's popped off
[[self retain] autorelease];

// Pop this controller and replace with another
[navController popViewControllerAnimated:NO];
[navController pushViewController:someViewController animated:NO];

Если в этой последней строке вы измените анимированный на YES , тогда новый экран будет фактически анимирован, а контроллер, который вы только что открыли, анимируется. Выглядит неплохо!

137
ответ дан 24 November 2019 в 08:46
поделиться

Спасибо, это именно то, что мне было нужно. Я также поместил это в анимацию, чтобы получить страницу curl:

        MyEditViewController *mevc = [[MYEditViewController alloc] initWithGizmo: gizmo];

    UINavigationController *navController = self.navigationController;      
    [[self retain] autorelease];

    [UIView beginAnimations:nil context:NULL]; [UIView setAnimationDuration: 0.7];
    [UIView setAnimationTransition:<#UIViewAnimationTransitionCurlDown#> forView:navController.view cache:NO];

    [navController popViewControllerAnimated:NO];
    [navController pushViewController:mevc animated:NO];

    [UIView commitAnimations];

0.6 продолжительность быстро, хорошо для 3GS и новее, 0.8 все еще немного слишком быстро для 3G...

Johan

4
ответ дан 24 November 2019 в 08:46
поделиться
Другие вопросы по тегам:

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