Выдвижение View Controller в стек навигации приводит к SIGABRT - PullRequest
1 голос
/ 13 июля 2011

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

Мое приложение загружается в представление карты с аннотациями.Если пользователь нажимает на одну из аннотаций, отображается вид выноски с дополнительной кнопкой.Проблема, с которой я столкнулся, заключается в том, что метод вызывается, когда нажимается дополнительная кнопка.Я хочу отобразить подробный вид для конкретной аннотации, но когда я нажимаю вспомогательную кнопку, приложение вылетает с SIGABRT.

// method that provides the view for when the callout accessory button is tapped
-               (void)mapView:(MKMapView *)mapView 
               annotationView:(MKAnnotationView *)view 
calloutAccessoryControlTapped:(UIControl *)control
{
    // grabs the annotation's title from the annotation view
    NSString *viewTitle = view.annotation.title;

    // grabs corresponding POI object for map annotation
    PointOfInterest *object = [[PointOfInterest alloc] init];
    object = [dictionary objectForKey:(NSString *)viewTitle];

    // assigns title and subtitle ivars to variables to be passed into detailviewcontroller init
    NSString *title = object._title;
    NSString *subtitle = object._subtitle;
    UIImage *picture = object._picture;
    NSString *description = object._description;

    // releases POI object after all the information has been taken from it
    [object release];

    // inits detailVC
    DetailVC *detailVC = [[DetailVC alloc] initWithNibName:@"DetailVC" 
                                                    bundle:[NSBundle mainBundle]];

    // sets the nsstring ivars in the DVC which correspond to the POI information
    detailVC.thetitleText = title;
    detailVC.thesubtitleText = subtitle;
    detailVC.thepictureImage = picture;
    detailVC.thedescriptionText = description;

    // sets the "back" button on the navigation controller to say "Back to Map"
    UIBarButtonItem *newBackButton = [[UIBarButtonItem alloc] initWithTitle:@"Back to Map" 
                                                                      style:UIBarButtonItemStyleBordered 
                                                                     target:nil 
                                                                     action: nil];
    [[self navigationItem] setBackBarButtonItem: newBackButton];
    [newBackButton release];

    // pushes navcontroller onto the stack and releases the detail viewcontroller
    [self.navigationController pushViewController:detailVC animated:YES];
    [detailVC release];
}

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

Вот код класса DetailViewController Заголовок:

@interface DetailViewController : UIViewController {
    IBOutlet UIScrollView *scrollview;
    IBOutlet UILabel *thetitle;
    NSString *thetitleText;
    IBOutlet UILabel *thesubtitle;
    IBOutlet UIImage *thepicture;
    IBOutlet UITextView *thedescription;
}

@property (nonatomic, retain) UIScrollView *scrollview;
@property (nonatomic, retain) UILabel *thetitle;
@property (nonatomic, retain) NSString *thetitleText;
@property (nonatomic, retain) UILabel *thesubtitle;
@property (nonatomic, retain) UIImage *thepicture;
@property (nonatomic, retain) UITextView *thedescription;

// method that creates the custom detail view with the corresponding information from
// the point of interest objects
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil title:(NSString*)title subtitle:(NSString *)subtitle picture:(UIImage *)picture description:(NSString *)description;

@end

Реализация:

@implementation DetailViewController

@synthesize scrollview, thetitle, thesubtitle, thepicture, thedescription, thetitleText;


- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil title:(NSString *)title subtitle:(NSString *)subtitle picture:(UIImage *)picture description:(NSString *)description;
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
        NSLog(@"view initialized");
}
return self;
}

- (void)dealloc
{
    [scrollview release];
    [thetitle release];
    [thesubtitle release];
    [thepicture release];
    [thedescription release];
    [thetitleText release];
    [super dealloc];
}

- (void)didReceiveMemoryWarning
{
    // Releases the view if it doesn't have a superview.
    [super didReceiveMemoryWarning];

    // Release any cached data, images, etc that aren't in use.
}

#pragma mark - View lifecycle

- (void)viewDidLoad
{
    [super viewDidLoad];
    NSLog(@"view did load");

    [thetitle setText:self.thetitleText];
    NSLog(@"thetitle text set");


// Do any additional setup after loading the view from its nib.
//    [thetitle setText:title];
//    NSLog(@"set title");
//    [thesubtitle setText:subtitle];
//    NSLog(@"set subtitle");
//    thepicture = picture;
//    [thedescription setText:description];
//    NSLog(@"set description");
}

Вот выход SIGABRT:

2011-07-12 19: 05: 06.678 mkeBOAT [1687: ef03] Принадлежность для выносного вызова нажата

2011-07-1219: 05: 06.679 mkeBOAT [1687: ef03] Башня банка США

2011-07-12 19: 05: 06.680 mkeBOAT [1687: ef03] (ноль)

2011-07-1219: 05: 06.680 mkeBOAT [1687: ef03] (null), (null)

2011-07-12 19: 05: 06.680 mkeBOAT [1687: ef03] представление инициализировано

2011-07-12 19: 05: 06.711 mkeBOAT [1687: ef03] * Завершение работы приложения из-за необработанного исключения

'NSUnknownKeyException', причина: '[setValue: forUndefinedKey:]: этот классне соответствует кодировке значения ключа для описания ключа. '

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

Спасибо за любую помощь!

Ответы [ 7 ]

3 голосов
/ 13 июля 2011

вы не должны этого делать

[detailViewController autorelease];

, прежде чем помещать detailViewController в стек.

Вы должны сначала вставить его в стек навигации, а затем выпустить его, поскольку он вам больше не нужен, и теперь стек навигации является владельцем объекта контроллера detailView.

так что вместо этого

[detailViewController autorelease];

// this is the line that breaks with SIGABRT
[self.navigationController pushViewController:detailViewController animated:YES];

сделать это

[self.navigationController pushViewController:detailViewController animated:YES];
[detailViewController release];

Дополнительная информация:

SIGABRT обычно происходит, когда в вашем IB остаются ссылки на выходы, но объект в вашем контроллере больше не существует.

Вы должны проверить все ваши ссылочные точки.

0 голосов
/ 03 февраля 2012

Убедитесь, что ваш View Controller имеет представление.Моя была бомбардировка (SIGABRT), как описано в вопросе, потому что я забыл в IB подключить точку просмотра (которая обычно создается для вас в вашем файле xib) к представлению моего контроллера.

0 голосов
/ 14 июля 2011

Внимательно прочитайте код ...

Вы сделали инициализировали object, используя:

PointOfInterest *object = [[PointOfInterest alloc] init];.

Почему переназначение object так:

object = [dictionary objectForKey:viewTitle];?

Итак, неважно в этом вопросе, но здесь есть утечка.Кроме того, я почти уверен, что сбой произошел из-за переназначения object на значение с соответствующим ключом viewTitle, попытки послать ему сообщение позже и, как вы только что подумали, манипулирования объектом типа PointOfInterest.

Надеюсь, это поможет.

0 голосов
/ 13 июля 2011

После перезапуска и создания нового контроллера детального вида я почти уверен, что мой вид связан с изображением, а не с фактическим видом. Чтобы составить это, я также считаю, что мое прокрутка действительно испортила все. Если кто-то хотел бы увидеть код, который действительно работает, просто дайте мне знать. Спасибо всем, кто внес свой вклад !! Какое замечательное сообщество SOverflow!

0 голосов
/ 13 июля 2011

В вашей реализации есть некоторые ошибки:

1) Не вызывайте родительский метод с фиксированным значением:

self = [super initWithNibName: @ "DetailViewController" bundle: nil];

вместо этого используйте параметры:

self = [super initWithNibName: nibNameOrNil bundle: nibBundleOrNil];

2) Ваш заголовок и свойства субтитра являются IBOutlet UILabel, но вместо этого вы сохраняете копию UILabel, измените копию путем сохранения

3) Вы инициализируете свой текст UILabel (thetitle и thesubtitle) в методе init, но в этом методе свойства еще не определены (thetitle и thesubtitle = nil).

Вместо этого вы должны использовать свойства NSString и установить текст UILabel в методе viewDidLoad со своими свойствами NSString.

И сделать то же самое для свойства thedescription UITextField.

И не забывайтеосвободить все ваши свойства, скопированные или сохраненные в dealloc, и сбросить свойства IBOutlet в вашем методе viewDidUnload.

Для точки 3:

Добавьте свойства NSString к вашему DetailViewController (и не забудьте синтезировать и выпустить его в dealloc):

@ property (nonatomic, retain) NSString* thetitleText;

далее, перед pushViewController, добавьте:

detailViewController.thetitleText = title;

и, наконец, в метод viewDidLoad вашего DetailViewController добавьте:

[thetitle setText: self.thetitleText];

И сделать то же самое для других ярлыков.

0 голосов
/ 13 июля 2011

Убедитесь, что для владельца класса файлов в XIB установлено значение DetailViewController.

0 голосов
/ 13 июля 2011

Я думаю, это потому, что у вас @property установлено copy, оно должно быть retain

...