Считайте данные plist в NSArray, но получите null - PullRequest
0 голосов
/ 31 августа 2010

Я получил то же самое предупреждение здесь «локальное объявление скрывает переменную экземпляра» предупреждение

но у меня больше проблем ...

Вот мой код

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {

 NSURLRequest *theRequest=[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.someaddress.php"]
             cachePolicy:NSURLRequestUseProtocolCachePolicy
            timeoutInterval:60.0];

 // create the connection with the request
 // and start loading the data
 NSURLConnection *theConnection=[[NSURLConnection alloc] initWithRequest:theRequest delegate:self];
 NSLog(@"\n\nCONNECTION:   %@", theConnection);
 NSData *returnData = [NSURLConnection sendSynchronousRequest:theRequest returningResponse:nil error:nil]; 
 NSString *listFile = [[NSString alloc] initWithData:returnData encoding:NSASCIIStringEncoding];   

 NSMutableArray *plist = [[NSMutableArray alloc] init];
 plist = [listFile propertyList];

 NSLog( @"\n 1111 plist is \n%@", plist );
   //I can get a plist format data here,But nothing in 2222
 NSLog(@"Now you see me tableView Row Count");
 NSLog(@"TOTAL PLIST ROW COUNT IS    = %i", [plist count]);


 // Return the number of rows in the section.
    return [plist count];
}

и я получил предупреждение здесь " Локальное объявление 'plist' скрывает переменную экземпляра "

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

 static NSString *CellIdentifier = @"LightCell";

 LightCell0 *cell =(LightCell0 *) [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
 if (cell == nil) {
  cell = [[[LightCell0 alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease];
 }
 // Set up the cell…
 NSLog(@"Now you see me Load Data %i", indexPath.row);

 [cell setSelectionStyle:UITableViewCellSelectionStyleNone];

    //I try to get list data here But RETURN NULL
 NSLog( @"\n 2222 plist is \n %@", plist);

 switch (indexPath.row) {
   case 0:
   if ([plist valueForKey:@"nodeStatus"] == 0){
    cell.lightImageView.image = [UIImage imageNamed:@"lightOff.png"]; 
    NSLog(@"value for key Node Status : %@" ,[self.plists Valuefokey:@"nodeStatus"]);
                            //also return NULL !!
   }

   else if([self valueForKey:@"nodeStatus"] == 1){
    cell.lightImageView.image = [UIImage imageNamed:@"lightOn.png"];
   }
   break;


  case 1:
   cell.lightLocation.text =[plist valueForKey:@"nodeName"] ;
   if ([plist valueForKey:@"nodeStatus"] == 0){
    cell.lightImageView.image = [UIImage imageNamed:@"lightOff.png"];
   }
   else if([plist valueForKey:@"nodeStatus"] == 1){
    cell.lightImageView.image = [UIImage imageNamed:@"lightOn.png"];
   };

   break;
  default:
   break;
 }
 return cell;
}

Это буксирные предметы, которые я создаю в списке

{
        category = Light;
        nodeID = 1;
        nodeName = "Living Room";
        nodeStatus = 0;
        nodeTrigger = 0;
        nodeType = "light_sw";
    },
        {
        category = Light;
        nodeID = 2;
        nodeName = Kitchen;
        nodeStatus = 0;
        nodeTrigger = 0;
        nodeType = "light_sw";
    }

Так что это мой вопрос, почему я не могу передать "plist" с

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
      ...
}

до

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
        ...
}

и я использую NSMutableArray *plist = [[NSMutableArray alloc] init];

Но все равно появляется " Локальное объявление 'plist' скрывает переменную экземпляра "

* 1 034 * ???

надеюсь, что кто-то может решить эту проблему

С наилучшими пожеланиями!

Ответы [ 3 ]

3 голосов
/ 31 августа 2010

и я получил предупреждение здесь "Локальное объявление 'plist' скрывает переменную экземпляра"

Ну, тогда тебе следует это исправить.

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

Решением является либо уничтожение, либо переименование локальной переменной. Если последнее - то, что вам нужно, используйте функцию Xcode «Изменить все в области».

Также:

NSMutableArray *plist = [[NSMutableArray alloc] init];
plist = [listFile propertyList];

Создание массива в первой из этих строк является излишним, поскольку вы немедленно заменяете указатель на этот массив указателем на другой массив, возвращаемый propertyList. Таким образом, вы никогда не используете и пропускаете первый массив. Вы должны по крайней мере исключить создание первого массива и, вероятно, вырезать всю первую строку (таким образом вырезая как первый массив, так и локальную переменную).

0 голосов
/ 16 сентября 2010

plist = [listFile propertyList]; =====> self.plist = [listFile propertyList]; ЭТО ПРАВИЛЬНО

0 голосов
/ 06 сентября 2010

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

1.Загрузить plist:

- (void)viewDidLoad {
NSURLRequest *theRequest=[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www. someaddress.php"]
                                              cachePolicy:NSURLRequestUseProtocolCachePolicy
                                          timeoutInterval:60.0];

    NSURLConnection *theConnection=[[NSURLConnection alloc] initWithRequest:theRequest delegate:self];
    NSData *returnData = [NSURLConnection sendSynchronousRequest:theRequest returningResponse:nil error:nil]; 
    NSString *listFile = [[NSString alloc] initWithData:returnData encoding:NSASCIIStringEncoding];   
    plist = [listFile propertyList];
}

2. вернуть число в строки

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return [plist count];
}

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

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *CellIdentifier = @"LightCell0";

    LightCell0 *cell =(LightCell0 *) [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[LightCell0 alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease];
    }
    // Set up the cell…

    [cell setSelectionStyle:UITableViewCellSelectionStyleNone];

    int i;
    for (i=0; i<[plist count]; i++) {

        //Get nodeName
        if(indexPath.row == i)
        {
            cell.lightLocation.text =  [[[plist objectAtIndex:i] valueForKey: @"nodeName"]description];


        //Get Light Status to show the image
        if ([[[plist objectAtIndex:i] valueForKey: @"nodeStatus"] intValue] == 0){
                cell.lightImageView.image = [UIImage imageNamed:@"lightOff.png"]; 
            }

        else if([[[plist objectAtIndex:i] valueForKey: @"nodeStatus"] intValue] == 1){
                cell.lightImageView.image = [UIImage imageNamed:@"lightOn.png"];
                cell.lightSwitch.on=YES;
            }   

        }
    }

    return cell;

}

Он может получить правильные данные и отобразить правильный результатв ячейках табличного представления BUTTTTTTT Если вы прокрутите вверх табличное представление, это нормально, когда вы наверху, оно прокрутится автоматически. Когда вы "прокрутите вниз" табличное представление, вылет программы ???

ЗАЧЕМ ???я что-то не так написал ???

...