2017-07-05 12 views
1

新しいデータをデータソースに追加するときに、テーブルビューの先頭に自動スクロールを無効にする方法を教えてください。自動スクロールを無効にする方法

問題は次のgifで確認できます。

enter image description here

編集:追加のViewController、ViewModelにしてMessageEntity。

使用されるフレームワークは次のとおりです。RxSwift、RxDataSources(テーブルビューのリアクティブデータソース用)。

のViewController:

class RabbitMqVC: BaseViewController { 

    struct Cells { 
     static let message = ReusableCell<MessageCell>(nibName: "MessageCell") 
     static let messageTheir = ReusableCell<MessageCellTheir>(nibName: "MessageCellTheir") 
    } 

    @IBOutlet 
    weak var tableView: UITableView!{ 
     didSet{ 
      rabbitMqViewModel.sections 
        .drive(tableView.rx.items(dataSource: dataSource)) 
        .addDisposableTo(disposeBag) 
     } 
    } 

    private let dataSource = RxTableViewSectionedAnimatedDataSource<RabbitMqViewModel.MessageSections>() 
    private let rabbitMqViewModel : rabbitMqViewModel 


    init(rabbitMqViewModel: rabbitMqViewModel) { 
     self.rabbitMqViewModel = rabbitMqViewModel 
     super.init(nibName: "RabbitMqVC", bundle: nil) 

     dataSource.configureCell = { _, tableView, indexPath, item in 
      let randomNumber = 1.random(to: 2) 
      let cell = randomNumber == 1 ? tableView.dequeue(Cells.message, for: indexPath) : tableView.dequeue(Cells.messageTheir, for: indexPath) 

      cell.message = item 

      return cell 
     } 

    } 


    override func viewDidLoad() { 
     super.viewDidLoad() 

     tableView.register(Cells.message) 
     tableView.register(Cells.messageTheir) 
     tableView.rowHeight = UITableViewAutomaticDimension 
     tableView.estimatedRowHeight = 80 

    } 

} 

のViewModel:

class RabbitMqViewModel: ViewModel { 

    enum MessageSections: AnimatableSectionModelType { 

     typealias Item = MessageEntity 
     typealias Identity = Int 

     case messages(messages: [MessageEntity]) 

     var items: [Item] { 
      switch self { 
      case .messages(messages:let messages): 
       return messages 
      } 
     } 

     var identity: Int { 
      return 1 
     } 

     init(original: MessageSections, items: [Item]) { 

      switch original { 
      case .messages: 
       self = .messages(messages: items) 
      } 
     } 
    } 

    // input 
    let didLoad = PublishSubject<Void>() 

    //output 
    let sections: Driver<[MessageSections]> 

    init(service: RabbitMqService,){ 
     let messages: Observable<[MessageEntity]> = didLoad 
       .flatMapLatest { _ -> Observable<[MessageEntity]> in 
        return service.listenMessages() 
       } 
       .share() 

     self.sections = messages 
       .map { (messages) -> [RabbitMqViewModel.MessageSections] in 
        var sections: [MessageSections] = [] 
        sections.append(.messages(messages: messages)) 

        return sections 
       } 
       .asDriver(onErrorJustReturn: []) 


    } 


} 

MessageEntity:それを修正

struct MessageEntity { 

    let id: String 
    let conversationId: String 
    let messageText: String 
    let sent: Date 
    let isSentByClient: Bool 
    let senderName: String 
    let commodityClientId : Int? 

} 

extension MessageEntity: IdentifiableType, Equatable { 

    typealias Identity = Int 

    public var identity: Identity { 
     return id.hashValue 
    } 
    public static func ==(lhs: MessageEntity, rhs: MessageEntity) -> Bool { 
     return lhs.id == rhs.id 
    } 
} 
+0

新しい行を追加した後は何をしていますか? tableView.reloadData? –

+0

いいえ、私はチェンジセットを計算します – JaSHin

+0

?コードを提供できますか? –

答えて

0
estimatedRowHeight = 1 

関連する問題