2017-06-04 23 views
7

Tôi có một ứng dụng nhỏ theo dõi người chơi chơi thời gian trong trò chơi thể thao. Tôi có một danh sách các trò chơi thể thao và bạn có thể nhấp vào một trò chơi và bắt đầu theo dõi chi tiết trò chơi. Tôi đang cố gắng thực hiện để trò chơi đang diễn ra và người dùng quay lại danh sách trò chơi, họ không thể nhấp vào một ô trò chơi khác vì nó ghi đè tất cả dữ liệu hiện tại trong trò chơi đang hoạt động.TableViewCell không tải lại như mong đợi

Tôi gần như đã thực hiện công việc này. Khi một trò chơi đang diễn ra và tôi quay trở lại danh sách các trò chơi thể thao, chỉ người chơi đang hoạt động mới có thể truy cập và hiển thị cho người dùng biết rằng trò chơi đó đang hoạt động. Nhưng khi tôi quay trở lại và thiết lập lại trò chơi đó, tôi mong đợi tableView của trò chơi thể thao cho tất cả có thể truy cập được. Nhưng họ thì không. Nó vẫn cho thấy chỉ có một trò chơi hoạt động và tất cả các trò chơi khác là không thể tiếp cận. Tôi đang sử dụng tableView.reloadData trong viewWillAppear. Tôi cũng đã hiển thị mã có liên quan bên dưới.

// gameViewController -> shows all the games you can track 
override func viewWillAppear(_ animated: Bool) { 
    self.tableView.reloadData() 
    for game in fetchedResultsController.fetchedObjects! { 
     print("Game Opposition is \(game.opposition)") 
     print("Is Playing? \(game.isPlaying)") 
     print("Current Playing Time \(game.currentGameTime)") 
     print("----------------------") 
    } 
} 

// game cell view controller -> checks to see if any games are in progress 
func isAnyGamesInProgress(games: [Game]) -> Bool { 
    let inProgressGames = games.filter({ Int($0.currentGameTime) > 0 && $0.gameComplete == false }) 
if inProgressGames.isEmpty { 
    return false 
} 
return true 
} 

// configures the games cells in tableview 
func configureFixtureCell(fixture: Game){ 
oppositionLabel.text = "\(fixture.team.name) v \(fixture.opposition)" 

// check if any games are currently in progress, if so disable all the other cells 
// this prevents a user being mid game and checking an old game and inadvertently updating all the played time values 
let games = fixture.team.game?.allObjects as! [Game] 

if isAnyGamesInProgress(games: games){ 
    isUserInteractionEnabled = false 
    inPlayLabel.isHidden = true // identifies that this game is in progress 
} 
// unset the sole game who's in progress 
if Int(fixture.currentGameTime) > 0 && !fixture.gameComplete { 
    isUserInteractionEnabled = true // makes this cell active 
    // show label as green dot 
    inPlayLabel.isHidden = false 
    inPlayLabel.layer.cornerRadius = 8 
    inPlayLabel.layer.masksToBounds = true 
    } 
} 

Bây giờ, điều này có hiệu quả khi tôi có trò chơi. Tôi quay trở lại danh sách trò chơi và trò chơi đang hoạt động có thể truy cập và hiển thị nhãn nhỏ và tất cả các ô trò chơi khác không hoạt động. Nhưng nếu tôi quay trở lại và thiết lập lại trò chơi, vì vậy nó không còn hoạt động, tất cả các trò chơi sẽ được hiển thị và có thể truy cập được. Nhưng trò chơi hoạt động vẫn được hiển thị là hoạt động và tất cả các ô trò chơi khác đều không thể truy cập được.

Tôi đã xác nhận rằng khi tôi đã đặt lại trò chơi mà nó không được phân loại là vẫn hoạt động bằng cách in ra một tin nhắn trong lời gọi isAnyGamesInProgress() trong configureFixtureCell(). Vì vậy, không chắc chắn lý do tại sao các hàng dường như không cập nhật, đặc biệt là khi tôi tải lại bảng khi bộ điều khiển danh sách trò chơi willAppear() ?? và tôi không lưu lại kết quả của trò chơi NSFecthController :)

Tôi đã đính kèm một số hình ảnh để hiển thị đầu ra của bàn điều khiển. Đầu tiên là tải ban đầu

Initial Load

game cơ bản dở dang enter image description here

Sau khi trò chơi resetenter image description here

+0

có thể không thực sự nói từ mã nhưng nó có thể liên quan để nhận được dữ liệu mới nhất trong viewWillAppear qua fetchedResultsController và đó không phải là giống như bản sao thu được như thế này ' let games = fixture.team.game?.allObjects như! [Game] ' –

+0

@UpholderOfTruth Tôi vừa viết một vòng lặp for vào FixtureViewCell để in ra các giá trị và chúng khớp với các giá trị của fetchedResultsController – Jonnny

+0

Còn dòng này' if Int (fixture.currentGameTime)> 0 &&! Fixture.gameComplete { '? Có thể nào fixture.currentGameTime vẫn ở trên 0 và khác với điều đó trong đối tượng fixture.team.game? –

Trả lời

3

nhìn vào mã, nó trông giống như một vấn đề reset tế bào tái sử dụng .

Thử đặt lại ô trong phương thức prepareForReuse().

Ghi đè nó trong phân lớp ô của bạn và nó sẽ được gọi mỗi khi một ô hiện có trước đó bị dequeueReusableCellWithReuseIdentifier loại bỏ.

Ví dụ trong Swift

class myCell: UITableViewCell { 

    ... 
    ... 
    override func prepareForReuse() { 
    // your cleanup code 
    } 

} 
+1

Tôi tin rằng bạn là chính xác, vì giải pháp của tôi là đặt rõ ràng cả hai điều kiện trong 'if isAnyGamesInProgress()'.Bạn có thể hiển thị mã trình diễn vui lòng cho câu trả lời của bạn không. Tôi cảm thấy câu trả lời của bạn có lẽ chính xác hơn và do đó hữu ích hơn cho độc giả. Cảm ơn :-) – Jonnny

+0

câu trả lời được cập nhật với preparForReuse() –

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