Tôi hoàn toàn bối rối, đây là tình hình:Tại sao popViewController chỉ làm việc mỗi thời gian khác
ứng dụng của tôi sử dụng Vị trí khuôn khổ cốt lõi để có được vị trí hiện tại của người dùng và sau đó ping máy chủ của tôi tại TrailBehind cho địa điểm thú vị lân cận và hiển thị chúng dưới dạng danh sách. Không vấn đề gì.
Để tiết kiệm pin, tôi tắt dịch vụ GPS sau khi nhận dữ liệu từ máy chủ. Nếu người dùng di chuyển trong khi sử dụng ứng dụng và muốn danh sách mới, anh ta nhấp vào "Làm mới" trên bộ điều khiển điều hướng và dịch vụ CLLocation được kích hoạt lại, một loạt dữ liệu mới sẽ được truy xuất từ máy chủ và bảng được vẽ lại.
Trong khi ứng dụng đang lấy dữ liệu từ máy chủ của tôi, tôi tải màn hình tải với hình cầu quay có nội dung "Đang tải, vui lòng đợi" và tôi ẩn thanh điều hướng để chúng không bị "quay lại".
Vì vậy, việc lấy dữ liệu ban đầu từ máy chủ sẽ hoàn hảo.
Lần đầu tiên tôi nhấn làm mới tất cả mã thực thi để có vị trí mới, ping lại máy chủ để có danh sách dữ liệu mới và cập nhật các ô. Tuy nhiên, thay vì tải chế độ xem bảng vì nó sẽ khôi phục thanh điều khiển điều hướng cho chế độ xem bảng nhưng vẫn hiển thị chế độ xem tải của tôi trong cửa sổ chính. Điều này chỉ đúng trên thiết bị, mọi thứ hoạt động hoàn toàn tốt trong trình mô phỏng.
Thời gian SECOND tôi nhấn làm mới chức năng hoạt động bình thường.
Thời gian THIRD tôi nhấn làm mới không thành công như trên.
Thời gian FOURTH tôi nhấn làm mới nó hoạt động bình thường.
Thời gian FIFTH tôi nhấn làm mới không thành công như trên.
v.v., thậm chí làm mới thành công và làm mới lẻ không thành công. Tôi bước qua tất cả các dòng mã của tôi bằng cách và tất cả mọi thứ dường như được thực hiện bình thường. Tôi thực sự tiếp tục bước qua các hướng dẫn cốt lõi và sau khi một số lượng lớn các nhấp chuột "bước qua" tôi thấy rằng xem bảng thực sự hiển thị trên màn hình tại một số điểm trong CFRunLoopRunSpecific, nhưng sau đó tôi nhấp "tiếp tục" và xem tải của tôi đã qua màn hình.
Tôi hoàn toàn bối rối. Hãy giúp tôi!! Rất cám ơn trước vì sự thấu hiểu của bạn.
Video of the strange behavior:
Mã liên quan:
RootViewControllerMethods (Đây là quan điểm cơ sở cho dự án này TableView)
- (void)viewDidLoad {
//Start the Current Location controller as soon as the program starts. The Controller calls delegate methods
//that will update the list and refresh
[MyCLController sharedInstance].delegate = self;
[[MyCLController sharedInstance].locationManager startUpdatingLocation];
lv = [[LoadingViewController alloc] initWithNibName:@"Loading" bundle:nil];
[self.navigationController pushViewController:lv animated:YES];
[super viewDidLoad];
}
- (void)updateClicked {
//When the location is successfully updated the UpdateCells method will stop the CL manager from updating, so when we want to update the location
//all we have to do is start it up again. I hope.
[[MyCLController sharedInstance].locationManager startUpdatingLocation];
[self.navigationController pushViewController:lv animated:YES];
//LV is a class object which is of type UIViewController and contains my spinning globe/loading view.
}
-(void)updateCells {
//When the Core Location controller has updated its location it calls this metod. The method sends a request for a JSON dictionary
//to trailbehind and stores the response in the class variable jsonArray. reloadData is then called which causes the table to
//re-initialize the table with the new data in jsonArray and display it on the screen.
[[MyCLController sharedInstance].locationManager stopUpdatingLocation];
if(self.navigationController.visibleViewController != self) {
self.urlString = [NSString stringWithFormat:@"http://www.trailbehind.com/iphone/nodes/%@/%@/2/10",self.lat,self.lon];
NSURL *jsonURL = [NSURL URLWithString:self.urlString];
NSString *jsonData = [[NSString alloc] initWithContentsOfURL:jsonURL];
NSLog(@"JsonData = %@ \n", jsonURL);
self.jsonArray = [jsonData JSONValue];
[self.tableView reloadData];
[self.navigationController popToRootViewControllerAnimated:YES];
[jsonData release];
}
}
CLController Phương pháp: Về cơ bản chỉ gửi tất cả các dữ liệu thẳng trở lại RootViewController
// Called when the location is updated
- (void)locationManager:(CLLocationManager *)manager
didUpdateToLocation:(CLLocation *)newLocation
fromLocation:(CLLocation *)oldLocation
{
NSLog(@"New Location: %@ \n", newLocation);
NSLog(@"Old Location: %@ \n", oldLocation);
@synchronized(self) {
NSNumber *lat = [[[NSNumber alloc] init] autorelease];
NSNumber *lon = [[[NSNumber alloc] init] autorelease];
lat = [NSNumber numberWithFloat:newLocation.coordinate.latitude];
lon = [NSNumber numberWithFloat:newLocation.coordinate.longitude];
[self.delegate noteLat:lat];
[self.delegate noteLon:lon];
[self.delegate noteNewLocation:newLocation];
[self.delegate updateCells];
}
}
Bạn đã từng bước qua các phương pháp này trong trình gỡ rối chưa? Chạy các công cụ trên đó để xem việc tạo/xóa đối tượng có phải là những gì bạn mong đợi không? Xin lỗi nếu tôi xúc phạm trí thông minh của bạn, nhưng vì tôi không thấy vấn đề từ cái nhìn nhanh, điều tiếp theo tôi muốn làm là bắt đầu bước qua ... – mikeh
Cửa sổ bật lên có xuất hiện nếu bạn thoát ứng dụng không? Có vẻ như bạn không rời khỏi ứng dụng đủ thời gian để sửa chữa GPS trong video. Thử đặt các điểm ngắt trong phương thức locationManager. –