#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. Но я считаю, что мой уровень знаний еще недостаточно высок, чтобы полностью понять эти строки