首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

关于 MVC 的一个常见的误用

上面的代码存在着这些潜在问题: ###1.Model 层“寄生”在ViewController 中 在这段代码中,View Controller 里的 **items** 充当了 model。...理想化的数据流动应该是单向的:UI 操作 -> 经由 View Controller 进行模型更新 -> 新的模型经由 View Controller 更新 UI -> 等待新的 UI 操作,而在例子中...在现有架构下,把从服务器获取已有条目的逻辑放到 ToDoListViewController 也是很自然的想法: override func viewDidLoad() { super.viewDidLoad...2.在添加和删除条目的时候,我们都需要进行网络请求,另外我们也需要根据请求返回的状态更新添加按钮的状态。...不论是从网络获取,还是保存在本地的数据库,这些操作都不必 (也不应写在 View Controller 中)。

90750

macOS开发之NSTableView的应用详解

在OS X v10.6版本之前,NSTableView中行数据载体视图必须是NSCell的子类,之后版本的OS X支持开发者创建基于View的TableView视图,同样也支持基于Cell的TabelView...二、构建一个简单的列表视图     首先新建一个测试工程,在ViewController.m文件中编写如下代码: #import "ViewController.h" @interface ViewController...这是一个最简单的TableView示例,但是细读代码,麻雀虽小五脏俱全。首先NSTableView中的列是由NSTableColumn类描述的。一个列表可以有多个列。...需要注意,如果只实现这两个方法,则NSTableView会自动从列对象NSTableColume中取具体的行视图,通过dataCellForRow方法。...如果我们要对Cell的渲染进行一些定制,可以在如下方法中实现: //将要渲染cell调用的方法 开发者可以拿到cell对象做定制 - (void)tableView:(NSTableView *)tableView

4.8K21
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    iOS 面试策略之系统框架-UIScrollView及其子类

    9.说说实现预加载的方法 关键词:#网络传输 #无限滚动 #Threshold 在实际开发中,列表经常需要随着滑动而不停的展示新的内容。在滑动到一定程度后,我们就需要发送网络请求,以获得新的数据。...网络请求是一种耗时且昂贵的操作,为了提高用户体验,开发者经常运用预加载的方式提前请求,这样可以在用户滑动到列表最底部之前提前获得最新数据,无需让用户等待。这就是无限滚动列表。...的数据,可是我们之前加载的第 30 到第 40 个 cell 的数据还没有被访问。...高度我们可以先设定为 0,之后在 prepare() 里进行更新。 prepare()。该方法发生在 UICollectionView 数据准备好,但界面还未布局之时。...为了避免循环引用,最好的方法就是在我们的 UICollectionViewLayout 子类中定义一个 protocol,然后让 ViewController 实现这个protocol,来完成高度的获得

    2.7K21

    iOS 9 Storyboard 教程(二下)

    引用,可以传递到这个方法.它用来往玩家数组里添加新的Player对象来作为数据源.然后它会告诉tableView添加了新的一行(在底部),因为tableView和它的数据源始终是同步的....直到你segue他们,其他的viewController才被实例化.当你关闭这些viewController的时候,他们就立即被释放了.所以只有使用的ViewController才存在内存中....现在让我们给这个新的控制器一些数据来显示吧.在GamePickerViewController.swift中,把一个具有硬编码值的games字符串数组添加到顶部: var games:[String]...在Main.storyboard里,按住ctrl把tableview的单元格拖拽到Exit,就想你之前做的一样,然后从弹框中选择unwindWithSelectedGame:. ?...不幸的是,unwind segue方法在tableView(:didSelectRowAtIndexPath:)之前执行,所以selectedGameIndex没有更新.

    2.2K10

    窥探Swift之协议(Protocol)和委托代理(Delegate)回调的使用

    一.从UITableView中来窥探协议的委托代理回调     UITableView这个高级控件在iOS开发中的出镜率是比较高的,今天的重点不是介绍如何使用UITableView, 而是让通过UITableView...上显示的数据了,在正常开放中这些数据往往来源于网络请求,而在本篇博客中就模拟数据源,来为我们的TableView提供显示的数据。...这个协议可以定义在EditViewController.swift源文件中。在协议定义之前,先对什么是协议简单的提上一嘴。...在该方法中,首先我们要暂存一下点击的是哪个Cell, 也就是记录一下点击Cell的IndexPath, 然后就是获取点击的Cell对象,因为通过该Cell对象,可以获取相应Cell上的数据。...8 9 //更新数据源中相应的数据 10 self.dataSource!

    3.6K80

    iOS14开发-UIView

    子 View 的顺序和子 View 返回的数组中的位置有关(storyboard 中左侧的树形结构图中的先后顺序)。...数据联动 在某一列滚动的时候,重新设置联动列的显示数据,然后进行刷新操作。...直接在 storyboard 中布局,不需要使用数据源方法,但如果需要使用到代理方法,仍然需要在控制器中实现相应的方法。 适用于基本不需要动态修改、布局固定的页面,如个人中心、设置等。...apply(_:animatingDifferences:):当要显示或更新数据时,通过调用 NSDiffableDataSourceSnapshot 对象的 apply 方法将其提供给数据源,该方法将比较当前显示的快照...NSCollectionLayoutAnchor 在 Item 中,可能需要给其加上小红点或者未读消息数等附加视图,在 UICollectionViewCompositionalLayout 中,可以通过

    11.9K10

    你可能需要为你的 APP 适配 iOS 11

    本文介绍iOS11中在UI方面做了哪些更新,有些更新可以为用户提供更加完美的体验,但也有的可能会给目前的APP带来异常bug 前言 前几天发现在做的APP在 iOS11 系统上动画有异常,在其他系统的设备上都是正常的...从iOS 7以来,我们在整个操作系统中都有这些半透明的bars,苹果鼓励我们通过这些bars绘制内容,我们是通过viewController 的edgesForExtendedLayout属性来做这些的...在测试Demo中,创建tableView到显示出来的过程中,contentSize的计算过程如下图: ?...Self-Sizing在iOS11下是默认开启的,Headers, footers, and cells都默认开启Self-Sizing,所有estimated 高度默认值从iOS11之前的 0 改变为...:)和一个类(UITableViewRowAction),代理方法返回的是一个数组,我们可以在这个代理方法中定义所需要的操作按钮(删除、置顶等),这些按钮的类就是UITableViewRowAction

    1.7K60

    优雅的处理网络数据,你真的会吗?不如看看这篇.

    相信大家平时在用 App 的时候, 往往有过这样的体验,那就是加载网络数据等待的时间过于漫长,滚动浏览时伴随着卡顿,甚至在没有网络的情况下,整个应用处于不可用状态。...;最后用 UITableView 来显示返回的数据,在 viewDidLoad 中先请求网络数据来获取一些初始化数据,然后再利用 UITableView 的 Prefetching API 来对数据进行预加载...其实这个无限滚动并不是真正意义上的永无止尽,严格意义上来讲它是有尽头的,只不过这个功能背后的数据是不可估量的,只有大量的数据做支持才能让应用一直不断的从服务端获取数据。...如何避免滚动时的卡顿 当你遇到滚动卡顿的应用程序时,通常是由于任务长时间运行阻碍了 UI 在主线程上的更新,想让主线程有空来响应这类更新事件,第一步就是要将消耗时间的任务交给子线程去执行,避免在获取数据时阻塞主线程...我们可以在 tableView:willDisplayCell:forRowAtIndexPath: 这个方法中进行数据绑定,这个方法在显示cell之前会被调用。

    1.4K20

    iOS面试题梳理(三)

    、b、c、d异步执行完成后,会回调这里}); 当然,我们还可以使用非常老套的方法来处理,通过四个变量来标识a、b、c、d四个任务是否完成,然后在runloop中让其等待,当完成时才退出runloop。...SDWebImage原理 调用类别的方法: 从内存中(字典)找图片(当这个图片在本次程序加载过),找到直接使用; 从沙盒中找,找到直接使用,缓存到内存。 从网络上获取,使用,缓存到内存,缓存到沙盒。...对沙盒的理解 每个iOS应用都被限制在“沙盒”中,沙盒相当于一个加了仅主人可见权限的文件夹,及时在应用程序安装过程中,系统为每个单独的应用程序生成它的主目录和一些关键的子目录。...,然后将之前所计算的scrollView的高度通过tableView展示出来。...默认是不启动的,若要启动则需要手动启动; 在一个单独的线程中,如果需要在处理完某个任务后不退出,继续等待接收事件,则需要启用RunLoop; NSRunLoop提供了一个添加NSTimer的方法,可以指定

    1.4K71

    iOS中CoreData数据管理系列四——进行数据与页面的绑定

    iOS中CoreData数据管理系列四——进行数据与页面的绑定 一、引言     在上一篇博客中,我们讨论了CoreData框架中添加与查询数据的操作,事实上,在大多数情况下,这些数据都是由一个UITableView...表视图进行展示的,因此,CoreData框架中还未开发者提供了一个类NSFetchedResultsController,这个类作为桥接,将视图与数据进行绑定。...在initWithFetchRequest:managedObjectContext:sectionNameKeyPath:cacheName:方法中,如果设置第三个参数,则会以第三个参数为键值进行数据的分区...{     //开启tableView更新预处理     [[self tableView] beginUpdates]; } //分区数据改变时调用的方法 - (void)controller:(NSFetchedResultsController...insertRowsAtIndexPaths:@[newIndexPath] withRowAnimation:UITableViewRowAnimationFade];             break;     } } //数据更新结束调用的代理

    71910

    IOS开发之微信山寨版

    2.Project最终运行的界面如下,下面带箭头的Cell点进去是一个ViewController,下面的图片都是在网上找得素材,第一个页面里面是放的动态的TableView,里面的数据是模拟网络请求过来的动态数据...3.不能只贴图片对吧,写程序是少不了代码的,从第一个页面入手,如何动态加载我们的TableView....在进行编码之前,首先得配置我们的cell模板,在我们动态TableView中用到几种Cell,我们就配置几种cell模板,在配置cell模板时要设置每个cell的identifier,便于在代码中根据不同的数据来选择我们数据对应的...下面是往我们动态TableView中的cell添加数据     (1)在我们相应的TableViewController类中创建我们的测试数据,来模拟网络请求。...要实现具体的业务逻辑,我们需要给每个ViewController关联实体类,然后在每个类中实现我们对应的业务逻辑,这样分析起来,微信的代码量还是蛮大的。

    1.3K50

    MVVM+RxSwift

    MVVM架构图 在ViewController 里将数据源绑定到对应的View,这里只是单向绑定,在ViewModel进行网络请求等改变数据行为的操作更新Model,再由ViewModel通知View...,并且提供了通过序列更新TableView的方法,这时候我们只要把ViewModel的数据输出序列绑定到TableView的数据源序列就可以了。...因为在某些业务场景下我们需要保存它,比如在网络请求错误的时候,我希望页面还会继续显示之前有数据的状态,这时候我们就可以在网络请求错误的序列中塞入我们之前保存的数据,这样页面还是显示原样,还有你注意没有这个属性是...viewDidLoad:当ViewController调用viewDidLoad的方法的时候会发送一个序列作为ViewModel输入,通过transform转化dataSource输出去更新TableView...在项目中对cell中的点击事件的处理方式是在ViewController里创建一个PublishSubject的序列,然后在事件回调或监听处主动调用onNext方法。

    1.5K20

    使用流动控制器(Flow Controller )实现 MVVM 协议模型

    总目标 在选择哪一个架构之前,我会制定一个包含这个架构所关注的能解决什么目标的列表,这是从我多年 Java 项目开发中总结出的。这帮助我定义我们架构的优点。下面是促使我测试的要点。...管理这些依赖并且决定哪些将使用的接口会是流控制器。 流控制器 流控制器是一个控制用户路径的小型类和结构的集合。这使我们能够为 A / B 测试创建不同的数据流,例如,权限管理。...MVVM 这种架构和我之前项目的架构很像,唯一不同的是 VC (ViewController) 必须接受一个兼容的 ViewModel(通过既定协议)。...这需要这些实体之间的代码耦合更具优势。 我们可以看到在 OwlsFlowController 案例中,通过配置选择是否在网格还是列表中显示数据,在本例中是固定的,但它可以有两种测试情况。...在本例中,只有数据和子单元的变化,可以作为一个参数传递,并为所有列表创建一份可重用的代码。 这里有趣的一点是实现了两种响应协议:一个用于网格和一个列表。但两个的实现是相同的。

    1K40

    在iOS中怎样创建可展开的Table View?(下)

    :在上面的代码我们只是改变一些cell的"isVisible"的值,那意味着,可见行的总数已经改变了.所以,在我们重新加载tableView之前,我们需要app找到可见行的索引值: func tableView...响应其他用户操作 在CustomCell.swift文件中,你可以发现CustomCellDelegate协议的所需的代理方法都已经被声明.通过在ViewController类里实现它们我们需要设法让app...总结 正如我开始说的,创建可展开的tableView在某些时候真的很有用,从麻烦当中创建新的视图控制器,可以用这种tableView来处理,它可以为app节省时间.在这次教程先前的部分,我向你提出了一种创建可展开...tableView的方法,主要的特点就是在一个plist文件中,所有cell的描述都使用具体的属性.我向你展示了当cell显示,打开或是选中的时候,如何使用代码处理cell的描述列表;此外,我给了你一个方法通过用户输入数据来直接更新它....尽管这个示例app的表单是假的,但是也是可以存在真实的app中的.在它代表一个完整组件之前,仍然有很多事情需要做.

    1.5K30

    iOS逆向(8)-Monkey、Logos

    在之前的几篇文章里已经介绍了APP重签名,代码注入,Hook原理,可以发现,将工程建好,脚本写好,我们就可以以代价非常小的方式对一个第三方的APP进行分析。...那么是否一种工具,可以将重签名,代码注入,Hook源代码,class-dump,Cydia Substrate,甚至是恢复符号表这些功能,集成在一个工程里面,让真正的逆向小白也能享受逆向的乐趣呢?...咱们就找到Hook的类名:SettingViewController 需要Hook的方法自然就是TableView的那些DataSource和Delegate了。...打开上文中获取到优酷的所有的头文件,所有SettingViewController,发现其只有一个TableView变量:_tabview。 那么毫无疑问,就是他了!...self,"_tabview") reloadData]; 其他的UI代码在这里就不一一解释了,全部代码如下,当然在Demo中也是有的,其中包括了数据的简单持久化功能: #import <UIKit/UIKit.h

    1.9K20

    你可能需要为你的 APP 适配 iOS11

    来改变safeAreaInsets的值,当你的viewController改变了它的safeAreaInsets值时,有两种方式获取到回调: 三、UIScrollView and UITableView...个数再加上几个,滑动时,tableView不停地得到新的cell,更新自己的contenSize,在滑到最后的时候,会得到正确的contenSize。...在测试Demo中,创建tableView到显示出来的过程中,contentSize的计算过程如下图: Self-Sizing在iOS11下是默认开启的,Headers, footers, and cells...都默认开启Self-Sizing,所有estimated 高度默认值从iOS11之前的 0 改变为UITableViewAutomaticDimension: 如果目前项目中没有使用estimateRowHeight...:)和一个类(UITableViewRowAction),代理方法返回的是一个数组,我们可以在这个代理方法中定义所需要的操作按钮(删除、置顶等),这些按钮的类就是UITableViewRowAction

    2.5K00

    你可能需要为你的APP适配iOS11

    来改变safeAreaInsets的值,当你的viewController改变了它的safeAreaInsets值时,有两种方式获取到回调: 三 UIScrollView and UITableView...个数再加上几个,滑动时,tableView不停地得到新的cell,更新自己的contenSize,在滑到最后的时候,会得到正确的contenSize。...在测试Demo中,创建tableView到显示出来的过程中,contentSize的计算过程如下图: Self-Sizing在iOS11下是默认开启的,Headers, footers, and cells...都默认开启Self-Sizing,所有estimated 高度默认值从iOS11之前的 0 改变为UITableViewAutomaticDimension: 如果目前项目中没有使用estimateRowHeight...:)和一个类(UITableViewRowAction),代理方法返回的是一个数组,我们可以在这个代理方法中定义所需要的操作按钮(删除、置顶等),这些按钮的类就是UITableViewRowAction

    82820

    iOS 面试策略之语言工具-Xcode使用

    Runtime issues 有三类:线程问题,UI 布局和渲染问题,以及内存问题。线程相关问题有很多,最常见的就是数据竞争(data race)。...这种多线程对同一个值进行写操作的行为就是数据竞争。 如果你正在跳槽或者正准备跳槽不妨动动小手,添加一下咱们的交流群931542608来获取一份详细的大厂面试资料为你的跳槽多添一份保障。...理论上 App 的启动时间是由 main() 函数之前的加载时间(t1)和 main() 函数之后的加载时间(t2)。...,不推荐; 使用 Zombie 和 Address Sanitizer,可以在绝大多数情况下定位问题代码,如下图: [image] Playground 技巧 6.在实际开发中,我们会测试网络请求收到的数据...要调试 api.org/get 是否工作,工程师在 Playground 中写下了以下代码。假设 API 和网络正常工作,请问这段程序将会打印出什么内容?

    1.7K20
    领券