2015-02-26 3 views
0

Я совершенно новый в разработке iOS. Сегодня я узнал, что такое UIActivityIndicatorView. Теперь я создаю проект, где у меня есть табличное представление, я заполнил таблицу, используя разбор JSON. Теперь я добавил индикатор активности, который будет вращаться до того времени, пока таблица не будет заполнена. Я запустил индикатор активности, но он не останавливается. Можете ли вы сказать мне, где я ошибаюсь? Заранее спасибо. Это мой код.UIActivityIndicatorView не останавливается

#import "ViewController.h" 

@interface ViewController() 

@end 

@implementation ViewController 

- (void)viewDidLoad { 
[super viewDidLoad]; 
// Do any additional setup after loading the view, typically from a nib. 
[self fetchData]; 
self.mySpinner = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhite]; 
_mySpinner.hidden = NO; 

} 

- (void)didReceiveMemoryWarning { 
[super didReceiveMemoryWarning]; 
// Dispose of any resources that can be recreated. 
} 

- (void) fetchData { 

[_mySpinner startAnimating]; 

NSString *strURL = [NSString stringWithFormat:@"http://api.kivaws.org/v1/loans/search.json?status=fundraising"]; 
NSURL *url = [NSURL URLWithString:strURL]; 
NSURLRequest *request = [NSURLRequest requestWithURL:url]; 
NSURLConnection *conn = [[NSURLConnection alloc] initWithRequest:request delegate:self]; 
if (conn) { 
    _webData = [NSMutableData data]; 
} 
else{ 
    //error 
} 

} 

#pragma mark Url connection Delegate 

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response { 
// A response has been received, this is where we initialize the instance var you created 
// so that we can append data to it in the didReceiveData method 
// Furthermore, this method is called each time there is a redirect so reinitializing it 
// also serves to clear it 
} 

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { 
// Append the new data to the instance variable you declared 
[_webData appendData:data]; 

} 

- (void)connectionDidFinishLoading:(NSURLConnection *)connection { 

// The request is complete and data has been received 
// You can parse the stuff in your instance variable now 
// self.data parse 

NSDictionary *dict= [NSJSONSerialization JSONObjectWithData:self.webData options:kNilOptions error:nil]; 
self.arrDetail = [dict valueForKey:@"loans"]; 

[self.mySpinner stopAnimating]; 
self.mySpinner.hidden = YES; 

[self.parserTable reloadData]; 

} 

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error { 
// The request has failed for some reason! 
// Check the error var 

} 

#pragma mark Table View Delegates 


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

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"]; 


NSDictionary *locationDict = [[self.arrDetail objectAtIndex:indexPath.row]valueForKey:@"location"]; 

UILabel *lbl1 = (UILabel*)[cell.contentView viewWithTag:1]; 
lbl1.text = [[self.arrDetail objectAtIndex:indexPath.row]valueForKey:@"name"]; 

UILabel *lbl2 = (UILabel*)[cell.contentView viewWithTag:2]; 
lbl2.text = [locationDict valueForKey:@"country"]; 


return cell; 

} 

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

return [self.arrDetail count]; 

} 


@end 
+0

Где Вы добавляете вертушку к виду? Вы добавили 'UIActivityIndicatorView' в построитель интерфейсов? – rckoenes

+0

В таблице. Да, точно. – Tirthendu

+0

В коде, который вы отправили, вы создаете код 'UIActivityIndicatorView', но не добавляете его в представление.Если 'mySpinner' является' IBOutlet', подключенным в конструкторе интерфейсов, тогда нет необходимости создавать счетчик в коде. – rckoenes

ответ

1

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

Просто удалите: self.mySpinner = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhite];

+0

Большое спасибо. Я осознал свою ошибку. – Tirthendu

+1

Мы все должны были научиться: D – rckoenes

+0

Я просто не знаю, почему люди голосуют за мои вопросы. : '(И моя репутация продолжает уменьшаться.:' ( – Tirthendu

0

Сначала инициализируйте свой счетчик, а затем позвоните по своему методу подключения, как показано ниже.

...

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    self.mySpinner = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhite]; 
    _mySpinner.hidden = NO; 
    _mySpinner.center = self.view.center; 
    [self fetchData]; 
} 

...

+0

Индикатор вращается, но после заполнения таблицы его не останавливает. – Tirthendu

+0

вы можете удалить линию выделения счетчика, если вы подключили Interface Builder. –

+0

В вашем случае у вас есть 2 разных счетчика, один из них находится в интерфейсе и запускается spinnig по вашему методу fetchData, затем вы создаете еще один счетчик, который не находится на экране. В конце вы вызываете stopAnimating, но этот селектор переходит к невидимому счетчику, и ваш видимый spinner продолжает вращаться. –

0
To start Activity indicater 
[cell.indicater startAnimating]; 

To start Activity indicater 
[cell.indicater stopAnimating]; 

Также набор свойств, как показано на скриншоте. Also set properties like shown in screenshot

+0

вы поняли вопрос и прошли через код? –

2

Решение

удалить эту строку из кода

self.mySpinner = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhite]

Проблему

Вы гавань показано Декларация собственности от mySpinner. Однако из вашего кода я могу сказать, что это IBOutlet, так как вы создали новый экземпляр UIActivityIndicatorView и не добавили его в качестве подвью, и вы все равно можете видеть индикатор активности на вашем представлении (поскольку он появляется и никогда не останавливает анимацию).

Причина, по которой она не прекращает анимировать, вы вызываете [_mySpinner startAnimating]; на свой IBOutlet. Затем создается новый экземпляр UIActivityIndicatorView, когда вы говорите

self.mySpinner = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhite]

теперь любые методы вы называете mySpinner будет называться по показателю активности, который не находится на ваш взгляд, но тот, который вы создали, потому что вы потеряли ссылку на него в тот момент, когда вы создали новый UIActivityIndicatorView.

Кроме того, поскольку вы новичок. Я бы предложил вам использовать self.mySpinner, насколько это возможно, и не использовать self и _ взаимозаменяемо, поскольку оба они должны использоваться в соответствии с потребностями. Причина этого выходит за рамки вашего вопроса.

Кроме того, если ваша проблема решена, не забудьте upvote и принять ответ;)

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