бесконечный цикл добавления вложенного представления

#iphone #objective-c #ios #methods

#iPhone #objective-c #iOS #методы

Вопрос:

Я немного смущен, и после бесчисленных попыток и прочтения нескольких статей я решил написать. моя проблема в том, что если вы вызываете метод из класса (xml), и он нацелен на viewcontroller, все идет хорошо, но если бы я мог добавить [self.view add …] его обратно в начало, перезагружая viewDidLoad класса ViewController, входящего в бесконечный цикл.

это то, что я делаю

класс (ViewController) .h

 #import <UIKit/UIKit.h>

@class  XMLStuff;

@interface skiSpeedViewController : UIViewController {
}

@property (nonatomic, retain) XMLStuff *xml;
  

.m

 - (void)viewDidLoad
{
    [super viewDidLoad];

    xml.skiSpeedC = self;

    GpsStuff *gps = [GpsStuff alloc];
    [gps init];
}
  

gps.m

 - (id)init
{
    self = [super init];
    if (self) {
        xml = [XMLStuff alloc];
}
}
-(void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation {
     [xml lon:newLocation.coordinate.longitude lat:newLocation.coordinate.latitude];
  

xml.h

 #import "skiSpeedViewController.h"

@class skiSpeedViewController;

@interface XMLStuff : NSObject <NSXMLParserDelegate> {
}

@property (retain, nonatomic) skiSpeedViewController *skiSpeedC;
  

.m

    @synthesize skiSpeedC;

- (void) parserDidEndDocument:(NSXMLParser *)parser {
NSLog(@"--%@", self.skiSpeedC); // Return (null)
[self.skiSpeedC riceviDic:datiMeteo];
}
  

ViewController.m

     -(void)riceviDic:(NSMutableDictionary *)dictMeteo {
        datiMeteo = [[NSMutableDictionary alloc]initWithDictionary:dictMeteo];
    }
}
  

Ответ №1:

 - (void) parserDidEndDocument:(NSXMLParser *)parser {
    classViewController *skiSpeedC = [classViewController alloc];
    [skiSpeedC riceviDic:datiMeteo];
}
  

Вы создаете новый экземпляр classViewController каждый раз. Ваш класс «xml» (XMLStuff?) должен иметь указатель на контроллер представления и вызывать riceviDic метод в этом экземпляре.

Вы получаете бесконечный цикл, потому что, когда вы выделяете объект XML в viewDidLoad, он тоже начинает анализировать XML, затем создает больше объектов XML, которые затем создают больше ViewControllers…

Итак, добавьте свойство в XMLStuff типа classViewController, и когда вы создаете его в viewDidLoad:

 xml.skiSpeedC = self;
  

Затем в parserDidEndDocument:

 - (void) parserDidEndDocument:(NSXMLParser *)parser {
    [self.skiSpeedC riceviDic:datiMeteo];
}
  

Обновить

Хорошо, после вашего редактирования все выглядит совсем по-другому — вы, кажется, ввели новый класс — GpsStuff, у которого есть свой собственный экземпляр XMLStuff (и хитро выглядящий метод инициализации, который, я полагаю, вы не скопировали должным образом?). Какой из них на самом деле анализирует ваш документ? XMLStuff в вашем контроллере представления или в GPSStufF? Я предполагаю, что в GPSStuff, для которого вы не установили skiSpeedC свойство. Ранее я предполагал, что вы вызываете все из своего контроллера представления.

Почему бы не удалить создание нового объекта XMLStuff из GPSStuff, а при создании GPSStuff в контроллере представления передать xml в него созданный вами объект:

 - (void)viewDidLoad
{
    [super viewDidLoad];

    GpsStuff *gps = [[GpsStuff alloc] init];
    XMLStuff *xml = [[XMLStuff alloc] init];
    xml.skiSpeedC = self;
    gps.xml = xml;
    [xml release];
}
  

Кроме того, skiSpeedC свойство, вероятно, не должно быть retain , поскольку оно по сути является назначением делегата, и контроллер представления не будет выпущен до того, как вы выпустите анализатор xml.

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

 GPSStuff *gps = [[GPSStuff alloc] init];
  

Не в двух строках. Вы хотите, чтобы то, что возвращается из init , было присвоено вашей переменной.

Комментарии:

1. Я бы сказал, что мы на полпути, бесконечный цикл закончился, хотя я не понимаю, почему, не могли бы вы это объяснить? но теперь я что-то упускаю, если я помещаю [self.view addToSubview: something]; ничего не отображается. пример: -(void)riceviDic:(NSMutableDictionary *)dictMeteo{labelBox = [[UILabel alloc] initWithFrame: CGRectMake(36, 43, 161, 93)];[ labelBox setBackgroundColor:[UIColor redColor]];[self.view addSubview:labelBox];} внутри класса ViewController

2. Я пытался, как вы говорите, но метка не отображается красным, не возражаю, если я использую тот же код внутри виджета, все идет хорошо — РЕДАКТИРОВАТЬ: даже если я добавлю [self.view bringSubviewToFront:labelBox];

3. Я понял, что не проверил, был ли вызван метод или нет, кажется, что [self.skiSpeedC riceviDic: datiMeteo] не работает

4. отлично! мы смогли заставить это работать! даже если я не понял, что происходит, когда мы пишем xml.skiSpeedC. Но я считаю, что мой уровень знаний еще недостаточно высок, чтобы полностью понять эти строки