如何禁用自动滚动到顶部

时间:2017-07-05 14:16:24

标签: ios swift rx-swift

当我将新数据附加到数据源时,如何禁用自动滚动到表格视图的顶部。

问题在以下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

    }

}

视图模型:

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
    }
}

1 个答案:

答案 0 :(得分:0)

estimatedRowHeight = 1

修正了它。