2012-03-13 24 views
32

Tôi có bộ điều khiển Xem hiển thị một số thông tin (không phải dạng xem bảng).Tải lại ViewController

Tôi có một cuộc gọi cập nhật đến máy chủ từ xa lấp đầy cơ sở dữ liệu của tôi. Tôi muốn hoàn toàn tải lại ViewController của tôi sau khi cuộc gọi cập nhật được thực hiện.

Tôi nên làm gì?

+2

Làm cách nào để cập nhật dữ liệu của bạn - tôi giả sử bạn đang sử dụng viewDidAppear? – Till

+0

Bạn không thể sử dụng NotificationCenter hoặc một giao thức để thông báo cho ViewController rằng bản cập nhật đã kết thúc? – Khal

+0

@Khal Tôi chưa bao giờ sử dụng Trung tâm thông báo, bạn có thể chỉ cho tôi một hướng dẫn hoặc hướng dẫn không? @Tôi sử dụng 'viewWill/DidAppear' cũng như' loadView' và 'viewDidLoad'. –

Trả lời

23

Bạn thực sự không cần phải làm:

[self.view setNeedsDisplay]; 

Thành thật mà nói, tôi nghĩ đó là loại giải pháp "hy vọng cho tốt nhất", trong trường hợp này là. Có một số phương pháp để cập nhật UIView của bạn:

  1. KVO
  2. Notifications
  3. Phái đoàn

Mỗi người có là ưu và nhược điểm. Tùy thuộc vào những gì bạn đang cập nhật và loại "kết nối" bạn có giữa lớp doanh nghiệp của bạn (kết nối máy chủ) và UIViewController, tôi có thể giới thiệu loại phù hợp với nhu cầu của bạn.

+0

Tôi đã đi với cái này khi tôi cần nó. –

+72

Câu trả lời này không thực sự trả lời câu hỏi. Bạn đề xuất 3 cách để tải lại chế độ xem, nhưng bạn không xây dựng hoặc thậm chí cung cấp liên kết đến thông tin về cách triển khai bất kỳ đề xuất nào trong số những đề xuất đó. – Gogeta70

+1

Tôi muốn tải lại chế độ xem phụ có hoạt ảnh tương tự như đẩy chế độ xem mới. –

2

Cập nhật vào nút dữ liệu ... thay đổi titles..whatever nhét bạn phải cập nhật ..

sau đó chỉ cần gọi

[self.view setNeedsDisplay]; 
+1

Tôi phải tải lại một vài mục từ Cơ sở dữ liệu. Tôi không nghĩ rằng vẽ lại các quan điểm là cách để đi ở đây. –

+0

@TiagoVeloso cách bạn giải quyết vấn đề này? –

-5

Bạn Phải sử dụng

-(void)viewWillAppear:(BOOL)animated 

và thiết lập mục của bạn như bạn muốn ...

+0

Đây có thể là gợi ý hợp lệ khi cần gửi * yêu cầu đến dịch vụ web để tải dữ liệu, nhưng nó không trả lời cách xử lý phản hồi dịch vụ web không đồng bộ để cập nhật chế độ xem. –

21

nếu bạn biết hasbee cơ sở dữ liệu của bạn được cập nhật và bạn muốn chỉ cần làm mới viewcontrolle (đó là trường hợp của tôi quá) . tôi không tìm thấy giải pháp nào khác nhưng những gì tôi đã làm là khi cơ sở dữ liệu của tôi cập nhật tôi được gọi là

[self viewDidLoad];

lại và hoạt động. hãy nhớ nếu bạn ghi đè lên chế độ xemWillAppear hoặc loadView khác, sau đó gọi chúng theo thứ tự giống nhau. thích.

[tự xemDidLoad]; [tự xemWillAppear: YES];

nhưng tôi nghĩ cần có giải pháp cụ thể hơn như nút làm mới trong trình duyệt. nếu có ai đã plz upload Anse

1

reinitialise bộ điều khiển xem

YourViewController *vc = [[YourViewController alloc] initWithNibName:@"YourViewControllerIpad" bundle:nil]; 
[self.navigationController vc animated:NO]; 
+0

đây là kiểu cũ. Các dự án hiện đại với bảng phân cảnh nhiều khả năng sẽ không sử dụng XIB; sử dụng Bảng phân cảnh để thay thế. – Raptor

3

Hãy thử điều này, Bạn phải gọi cả hai phương pháp để tải lại xem, như một này làm việc cho tôi,

-Objective- C

[self viewDidLoad]; 
[self viewWillAppear:YES]; 

-Swift

self.viewDidLoad() 
self.viewWillAppear(true) 
+1

Đây không phải là câu trả lời đúng. Khi u gọi viewDidLoad để xem lại thì bộ nhớ sẽ tăng cho ứng dụng của bạn. Nó không phải là câu trả lời đúng .. – Singapore

+0

nó vẫn hoạt động cho người khác vì vậy xin vui lòng không làm cho downmark @ Singapore –

+0

phương pháp vòng đời điều khiển cuộc gọi không phải là ở tất cả các khuyến cáo –

0

Trực tiếp đến ViewController của bạn một lần nữa. trong tình huống của tôi [self.view setNeedsDisplay];[self viewDidLoad]; [self viewWillAppear:YES]; không hoạt động, nhưng phương pháp bên dưới hoạt động.

Trong C Mục tiêu

UIStoryboard *MyStoryboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil ]; 
UIViewController *vc = [MyStoryboard instantiateViewControllerWithIdentifier:@"ViewControllerStoryBoardID"]; 
[self presentViewController:vc animated:YES completion:nil]; 

Swift:

let secondViewController = self.storyboard!.instantiateViewControllerWithIdentifier("ViewControllerStoryBoardID") 
self.presentViewController(secondViewController, animated: true, completion: nil) 
7

Nếu bạn muốn tải lại một ViewController ban đầu được nạp từ một XIB, bạn có thể sử dụng phần mở rộng UIViewController tiếp theo:

extension UIViewController { 
    func reloadViewFromNib() { 
     let parent = view.superview 
     view.removeFromSuperview() 
     view = nil 
     parent?.addSubview(view) // This line causes the view to be reloaded 
    } 
} 
0

Bạn không nên tự mình gọi ViewDidLoad hoặc ViewWillAppear.

Trong ViewDidLoad có hàm loadData() để chuẩn bị dữ liệu. Điều này được thực hiện trong lần chạy đầu tiên.

Khi bạn muốn tải lại, hãy gọi lại loadData() để lấy dữ liệu từ mô hình. Trong một tableView gọi reloadData() hoặc trong một khung nhìn thông thường setNeedsDisplay().

Các vấn đề liên quan