2014-06-27 3 views
0

Прежде всего, я хочу поблагодарить всех вас! :)Предупреждение: попытка представить * чей вид не находится в иерархии окон

Итак, у меня есть главный контроллер вида с табличным представлением с пользовательскими ячейками другого класса. Я сделал пользовательский выбор ячейки (вам нужно сдвинуть ячейку представления). В этом действии я вызываю метод в основном контроллере просмотра для отправки SMS. Но я получаю это предупреждение, и контроллер SMS не появляется. Я знаю, что это сообщение об ошибке означает, что он не может открыть SMS-контроллер, потому что главный контроллер не загружен? Я пробовал некоторые коды отсюда, но для меня ничего не работает. Мои занятия в настоящее время выглядит следующим образом:

Main controller.m 

. 
. 
. 

-(void)viewWillAppear:(BOOL)animated 
{ 
    [self.citiesButton setTitle:rowValue forState:UIControlStateNormal]; 

    UITableView *tableView = (id)[self.view viewWithTag:1]; 
{ 
    tableView.rowHeight = 100; 
    UINib *nib = [UINib nibWithNibName:@"TableViewCell" bundle:nil]; 
    [tableView registerNib:nib forCellReuseIdentifier:CellTableIdentifier]; 

    UIEdgeInsets contentInset = tableView.contentInset; 
    contentInset.top = 20; 
    [tableView setContentInset:contentInset]; 

    NSLog(@"rowValue is %@", rowValue); 
    self.city = [_dict objectForKey:rowValue]; 
} 

    NSLog(@"View will appear"); 
    [tableView reloadData]; 
} 

-(void)sendSMS 
{ 
    MFMessageComposeViewController *controller = [[MFMessageComposeViewController alloc] init]; 
    if([MFMessageComposeViewController canSendText]) 

    { 
     controller.body = @"Testy Test"; 
     controller.recipients = [NSArray arrayWithObjects:@"774252704", nil]; 
     controller.messageComposeDelegate = self; 

     [self dismissViewControllerAnimated:YES completion:^{ 
     [self presentViewController:controller animated:YES completion:nil]; 
    }]; 

} 
} 

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

Большое спасибо за ваше время!

===== EDIT =====

Вот пользовательский класс клеток, из которых я вызываю метод SendSMS

tableViewCell.m 

#import "TableViewCell.h" 
#import "TableViewController.h" 

static NSString *CellTableIdentifier = @"TableViewCell"; 

@implementation TableViewCell 

@synthesize timeLabel = _timeLabel; 
@synthesize priceLabel = _priceLabel; 
@synthesize infoLabel = _infoLabel; 


- (void)awakeFromNib 
{ 
    // Initialization code 
} 


-(void)layoutSubviews 
{ 
    UIPanGestureRecognizer *panGesture = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panGestureRecognizer:)]; 

    [self addGestureRecognizer:panGesture]; 
} 


-(id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier { 

    self = [super initWithStyle:style reuseIdentifier:CellTableIdentifier]; 



    return self; 
} 

- (void)setSelected:(BOOL)selected animated:(BOOL)animated 
{ 
    [super setSelected:selected animated:animated]; 

    // Configure the view for the selected state 
} 

-(void)panGestureRecognizer:(UIPanGestureRecognizer *)sender{ 
    CGPoint translation = [sender translationInView:self]; 

    TableViewController *mainController = [[TableViewController alloc] init]; 

    //NSLog(@"Panned with translation point: %@", NSStringFromCGPoint(translation)); 

    sender.view.center = CGPointMake(sender.view.center.x + translation.x, 
           sender.view.center.y); 


    CGPoint breakingPoint = CGPointMake(320,sender.view.center.y); 
    CGPoint startPoint = CGPointMake(150, sender.view.center.y); 
    CGPoint endPoint = CGPointMake(500, sender.view.center.y); 

    if (sender.view.center.x <= startPoint.x) { 
     sender.view.center = startPoint; 
    } 

    if (sender.state == UIGestureRecognizerStateEnded) { 
     if (sender.view.center.x >= breakingPoint.x) { 

      [UIView animateWithDuration:0.2 
           delay:0.0 
          options: UIViewAnimationOptionCurveEaseOut 
         animations:^{ 
          sender.view.center = endPoint; 
         } 
         completion:^(BOOL finished){ 
          NSLog(@"Bought!"); 
          [mainController sendSMS]; 
         }]; 

    } else { 
     //recognizer.view.center = startPoint; 

     [UIView animateWithDuration:0.2 
           delay:0.0 
          options: UIViewAnimationOptionCurveEaseOut 
         animations:^{ 
          sender.view.center = startPoint; 
         } 
         completion:^(BOOL finished){ 
          NSLog(@"Returned!"); 
         }]; 
    } 
} 
    [sender setTranslation: CGPointZero inView: self]; 
} 
+0

Проверьте, нет ли контроллера в блоке завершения. – dostrander

+0

Пробовал, не повезло ... Я действительно застрял в этом ... Может быть [tableView reloadData] в ViewWillAppear ошибка? – user3573289

+0

можете ли вы показать код, на который вы называете [self sendSMS]? – HaneTV

ответ

1
- (void)presentViewController:(UIViewController *)viewController animated:(BOOL)animated onComplete:(void (^)(void))callback 
{ 
    AppDelegate *APP_DELEGATE = [UIApplication sharedApplication].delegate; 

    UIViewController *presentedModalVC = [APP_DELEGATE.window.rootViewController presentedViewController]; 

    if (presentedModalVC) { 
     while (presentedModalVC.presentedViewController) { 
      presentedModalVC = presentedModalVC.presentedViewController; 
     } 
     [presentedModalVC presentViewController:viewController animated:animated completion:callback]; 
    } else { 
     [APP_DELEGATE.window.rootViewController presentViewController:viewController animated:animated completion:callback]; 
    } 
} 

-(void)sendSMS 
{ 
    MFMessageComposeViewController *controller = [[MFMessageComposeViewController alloc] init]; 
    if([MFMessageComposeViewController canSendText]) 

    { 
     controller.body = @"Testy Test"; 
     controller.recipients = [NSArray arrayWithObjects:@"774252704", nil]; 
     controller.messageComposeDelegate = self; 

     [self presentViewController:controller animated:YES onComplete:nil]; 
    }    
} 

Вы должны представить свой виртуальный канал на представленном в настоящее время ВХ, если есть, то есть, если у вас есть эта иерархия представлена ​​ВК

 
VC1--- 
    VC2 - presented by VC1----- 
    VC3 - presented by VS2---- 
... 
     VCx - presented by x-1 

Тогда вы должен представить ваш новый vc на VCx, то есть на последнем vc, который в настоящее время представлен/видим.

+0

Можете ли вы реализовать это в моем коде? Я все еще не могу понять это ... Спасибо вам большое! – user3573289

+0

См. Отредактированный ответ – arturdev

+0

Хорошо, попробовал это решение, но все равно не повезло ... По-прежнему такая же ошибка! – user3573289

1

Моя догадка, основанная на описании (и если я правильно понимайте свой код) - это ваш отказ от mainViewController, а затем после того, как он исчезнет, ​​чтобы представить контроллер представления. Поскольку он был уволен, ему ничего не разрешено.

Это как когда девушки-разведчики приходят к вам домой, чтобы доставить ваши печенья, вы говорите им: «Вернитесь домой и не вернетесь, а когда вы вернетесь домой, оставите куки на моей входной двери».

Попробуйте переместить код, который отклоняет mainViewController, а затем представляет новый контроллер в контроллер представления, который первоначально был представлен mainViewController.

Edit:

я нашел другую ошибку в классе UITableViewCell. Проблема заключается в этой строке, расположенной в вашей функции panGestureRecognizer.

TableViewController *mainController = [[TableViewController alloc] init]; 

Ваш создание экземпляра mainController, а затем несколько строк позже свое призвание

[mainController sendSMS]; 

Который пытается представить контроллер представления, однако, что экземпляр mainController никогда не помещается в стек зрения, таким образом, ошибка.

Что вам нужно сделать, так это вызвать sendSMS на экземпляр tableviewController, который является таковым, который поддерживает tableview, и, таким образом, tableViewCell. Heres еще один пост, который говорит о том, как сделать это Reference from UITableViewCell to UITableView to UINavigationController

+0

upvote для girlscout reference – dostrander

+0

Хороший ответ! :) В любом случае, если я правильно понимаю это, достаточно ли удалить часть dissmiss в методе sendSMS и оставить там только это? [self presentViewController: контроллер анимированный: ДА завершение: ноль] Так как это то же самое проблема – user3573289

+0

Да, это должно сработать. Вполне возможно, что одновременно будет представлено несколько контроллеров представления. Каждый вызов функции rejectViewController просто удаляет верхнюю часть, как стек. – Brandon

Смежные вопросы