1:程序第一次进入的时候,通过判断沙盒(偏好设置中)中保存的版本号和程序运行的版本号进行判断。如果不相同,就进入新特性页面 》 》1:新特性页面展示的新特性图片,都是从plist中读取出来,最终读取出来的plist的图片信息,放在scrollerview上展示 》2:
1:程序第一次进入的时候,通过判断沙盒(偏好设置中)中保存的版本号和程序运行的版本号进行判断。如果不相同,就进入新特性页面 ——》
》1:新特性页面展示的新特性图片,都是从plist中读取出来,最终读取出来的plist的图片信息,放在scrollerview上展示
》2: 在新特性页面,中最后一个uIImageview,放入一个开始按钮。(注意,把图片背景拉伸的方法,按钮背景
2:在展示主界面的viewDidLoad方法中此时从沙盒(document)中读取有没有access_token(即调用单例方法) 判断是否是第一次登陆,如果没有登陆立即弹出登陆模态对话框
》2_1:登陆模态对话框,中view是webview,通过新浪的连接,加载新浪的登陆界面。在webview 中代理方法shouldStartLoadWithRequest 监听新浪返回的access? token ,如果返回access_token立即写入沙盒。一般写入沙盒,都自定义实体,用归档。其中自定义一个微博帐号实体,实现nsCoding ,被写入沙盒。
>2:其中新浪微博帐号实体(access_token ,uid,screen_name,experinTime)
要写成单例类,因为每次向新浪微博发送请求,都要用access_token ,uid等字段,所以最好写入单例,供整个程序使用
单例类:重写 alloc init retain retaincount, release ,copy,等方法 用一个静态变量进行判读,如果是第一次,就创建,不是的直接返回,单利是一致存在。其中单利类的对象字段都不用释放,最好是简单字段。
在单利类中定义一个静态方法,方法调用 :也是通过一个静态变量进行判断,如果存在直接返回,如果存在,先从沙盒中去,如果沙盒中没有,就直接创建。
》3:授权成功之后,直接跳到 主界面,
3:主界面 是一个自定义tabbarControllerview.
1: 主界面是一大的控制器 ——》主的控制区(大的)有2个部分组成 一个contentview 和下面 tabbarview组成。 其中下面的tabbarview 中导航按钮有 这个主控制里面装有的子导航控制器决定。
、 2:初始化大控制器中contentview,确定位置 。
3:;初始化5个导航控制器(5个导航控制器中有各自的根控制器和导航控制器的描述(其中导航器对应描述是一个实体)在主控制中 持有5个子控制器和5个导航控制描述)。其中导航控制是系统即可,并且设置导航控制中子控制的默认的导航title。
代码如下。
-(void)InitController{
HomeController *home = [[HomeController alloc] init];
[self addController:home title:@"首页" normal:@"tabbar_home.png" highlighted:@"tabbar_home_highlighted.png"];
[home release];
MyDataController *data = [[MyDataController alloc] init];
[self addController:data title:@"我的资料" normal:@"tabbar_message_center.png" highlighted:@"tabbar_message_center_highlighted.png"];
[data release];
FriendController *friend = [[FriendController alloc] init];
[self addController:friend title:@"我的关注" normal:@"tabbar_profile.png" highlighted:@"tabbar_profile_highlighted.png"];
[friend release];
FollowerController *follower = [[FollowerController alloc] init];
[self addController:follower title:@"我的粉丝" normal:@"tabbar_discover.png" highlighted:@"tabbar_discover_highlighted.png"];
[follower release];
UIViewController *more = [[UIViewController alloc] init];
more.view.backgroundColor = [UIColor darkGrayColor];
[self addController:more title:@"更多" normal:@"tabbar_more.png" highlighted:@"tabbar_more_highlighted.png"];
[more release];
}
》===================================》
-(void)addController:(UIViewController *)viewcontroller title:(NSString *)title normal:(NSString *)normal highlighted:(NSString *)hightlight{
//包装成导航控制器
UINavigationController *nav=[[UINavigationController alloc] initWithRootViewController:viewcontroller];
viewcontroller.navigationItem.title=title;
nav.delegate=self;
TabbarItemDesc *desc=[TabbarItemDesc TabbarItemTitle:title normal:normal height:hightlight];
[_viewcontrollerdatas addObject:desc];
[self addChildViewController:nav];
[nav release];
4: 初始化tabbar的位置和创建下面的导航按钮
4.1即在主控制器中指定tabbar的位置,因为tabbar是自定义view的。把主控制器中持有5个导航控制描述集合,传入进去——》然后在内部,根据传入导航控制器描述的集合,创建5个按钮,并且设置按钮的描述信息和背景图片 。
4.2 要把排号导航信息和导航的图片要重写button按钮,并且传入 描述信息,图片。之后重写button的两个方法重新调整。
一个label 方法-(CGRect)titleRectForContentRect:(CGRect)contentRect{
一个是imageview方法
-(CGRect)imageRectForContentRect:(CGRect)contentRect{
4.3 在tabbar 中创建多个button,之后,分别附上 tag属性 最好是按顺序的——》并且注册button的点击按钮-管理 按钮的点击事件。
——》设置按钮点击选中背景的切换,和变在外面 控制对应的导航控制器
——》记录上一个点击按钮的和当前点击按钮的信息,进行内部切换背景(移出上一个,的状态,更新当前的状态。
——》要外部控制 各自导航控制器官 ,要传出去,需要自定义协议(代理)和主控制器进行交互。
à然后主控制实现tabbar定义的代理方法,监听 tabbar中按钮的事件(传出当前按钮的tag 和上一个按钮的tag),通过传出的两个tag,然后在主控制器集合中取出来控制器的view 在contentview,中remove(取出上一个控制器,然后remove当控制器的view 和add(取出当前控制器view出去来添加到contentview中)
。
第二步:主控制中添加了5个子导航控制器,然后在添加导航控制器中,设置代理
在代理方法中(navigationController willShowViewController)监听每个导航控制器中即将出来的viewcontroller. 进行判断 1-2之间中可以加动画实现。
可以用uiview 实现动画——》
1:如果是根控制器——》 显示tabbar(就是把tabbar的y坐标=self.view的高度-tabbar的高度。Contentview的(height)高度=self.view的高度-)tabbar的高度
2:如果不是根控制器——》把tabbar的高度(就tabbar的y的坐标=self.view的高度。 Contentview 的高度=self.view的高度。
说明图层动画——》就是针对于图层上变化 转场动画和uiview动画。
3:然后在不是根控制器中,即将显示viewcontroller可以可以设置 定制left的导航(用button)和右边的导航控制器,button的按钮用image的大小。
并且注册监听事件。进行pop根控制器和栈顶控制器。 这样统一监听和同一个管理
我的关注和我的粉丝:两个模块 ——》新浪微博服务器返回 用户信息(user)和最近条微博(statu)的数据模型是一样的,只是 请求的连接不同。
只要是返回数据的模型一样,就可以抽取一个父类,然后在父类 公布一个方法,让子类各自实现。统一由父类调用。实现不同的数据。
我的粉丝和我的关注的分析
1: 实体: 用户类 (user) status (微博类)此时一对一。(其中user中持有user类)
2:在dao:使用ASIHttpRequest 框架 向服务器发送请求,然后代理把结果返回,(注意请求是异步线程,返回结果回到主线程)注意 ASIHttpRequest 是异步线程请求,返回到主线程的时候,在外面viewcontroller中调用对象可能早就释放了。
所以内部要持有这个对象,知道请求完成,调用完成对象block,之后就可以销毁。
在调用 的时候self retain ——》在代理调用完成之后block self release
或者在失败的时候 self release;
1:提供一个方法 是根据不同url和uid等信息, 向服务器发送请求(方法内部封装,ASIHttpRequest 向新浪微博服务器发送请求)。
然后在代理,来监听返回的数据,用sbjson来进行新浪返回的数据。返回的数据,一般用block返回出去,方面在外面调用的控制器号接受数据
block的参数1:返回成功的数据 2:返回错误的信息,3:分页数,总页数)
2:分别提供两个方法 :分别是 粉丝和关注的方法 方标外部调用,实现动态 发送请求。两个方法内部调用(1:内部的方法,即返回外面的数据相同)
3:自定基类——》里面实现uitableview 在viewload里面 调用上面的dao的请求的信息。在调用发送向新浪微博请求的信息的方法 ,
》3.1 此时把这个方法 父类 提取一个公用方法,父类不现实让子类去实现各自逻辑。然后判断如果子类实现这个方法,父类在回调回来。就可以接受数据了。每个子类只要实现父类的方法,就即可,接受数据(因为数据相同,如果不相同不能公用),由父类完成。然后重现加载数据(reload )
》3.2 在tabviewcell ,进行赋值,注意的是给cell中图片赋值的时候——》
此时图片要实现异步下载。
此时异步下载,是自己实现一个任务,把任务放在一个队列执行异步下载。
自定义任务 继承NSOperation 重写main方法 :main方法的实现说明
1:main里面的方法 放在队列中执行,是异步执行。要用一个自动释放池
在里面判断,第一次和加载大数据之后都要判断请求释放被取消。如果没有用gcD 把下载后的图片调度到主线程,用block返回。在外面的viewcontroller是主线程就可以直接操作ui控件。
总结 主要是在DAO 中 发送请求 (ASIHttpRequest 在发送请求是异步,在接收数据回到主线程 在viewcontroller 中的block接收数据,此时在viewcontroller中可以处理数据。在下载图片,是自定义NSOperation 也是这样的。下载完成 block 返回赋图片的值。
2:在首页和我的资料 的微博数据的布局是一样的。
1:实体类 微博类(status) 用户类(user) ——》status中持用user 是一对一,不可能循环持有。 循环持用( //循环引用要具备2个条件
//1:两个类相互持有并且都是retain 2;两个对象相互引用。)微博和用户类只满足一个条件相互持有都是retain。不满足两个对象相互引用,
2:dao类: 其中 在ASIHttpRequest中调用的时候自己retain和加载完成和失败的release.
1:封装一个方法,通过不同URL 用ASIHttpRequest向新浪微博发送请求,然后在代理中用sbjson中,解析数据,用block放回 block的参数(返回的数据,返回错误的信息,分页数,总数)
2:分别提供两个方法,一个是首页发送信息,一个是我的关注的首页,两个方法。
内部调用(asiHttpRequest向新浪微博发送请求)
3:在我的首页和资料只是头部不同,其他的数据相同
3: 显示信息自定义cell(原理说明:1:每当由一个cell ,进入视野的时候,都会调用 tableview的代理方法,算出来cell 的高度,存入到缓存,然后创建和循环使用cell的时候在调整cell内部的layOutSubiview的方法调整contentview的大小
1:在cell Init方法的时候 加载所有的控件的位置,cell从索引中取出来对应的高度——》在layoutsubview 调整cell内部的高度和cell的高度。
2:其中cell内部高度是怎样布局了。
2.1》因为各个要重新给各个控件进行重新定位,各个控件的高度要根据内容来确定高度。一:通过内容来计算高度的方法:sizeWithFont:[UIFont systemFontOfSize:kScreenNameSize] constrainedToSize
其中label的numbeofline 要设置为0 可以自动换行 ,初始化控件要设则显示内容的空间的字体。
2.2 用一个statuFrame实体类:来记录 每个控件的位置和cell的总高度,其中记录的高度是readonly
2.3:在计算各个控件的位置,按照图的顺序,下一个以上一个为标准来计算
分几种情况,分别记录cell的高度。
2.4在初始化微博的数据,把输入微博的数据传入到statuFrame中得到各个控件的位置和cell的高度。
流程 1:初始化status ,给status中所有的字段进行赋值,2:然后在实例化self.statuFrame=[statuframe alloc] initwithStatu:statu] autorelease];
然后在statuFrame内部,拿到微博的数据进行布局,布局的原则,下一个以上一个来计算包括高度。这样思路清晰。
这样通过内容就回自动算出来cell的高度,记住在初始化cell内部控件的时候,自定的字体和要显示换行,和statuframe算出的高度字体要一致。
其中图片的cell中UIImageview 要暴露出去,以便异步下载使用进行复值。
3:在viewcontroller中获取信息之后,在调整高度的时候,就可以获取cell的对应高度,在创建cell的时候,cell中暴露出一个@property (nonatomic,retain) Staus.重写setStatus方法,进行给各个控件赋值。在调用layoutSubview中的时候,再次使用status中statusFrame,就可以调整位置。
我的资料,:数据和首页的微博内容格式一致,所以可以直接重写父类调用公布的方法。
在重写父类公布的公用方法——》调用不同方法,返回的数据相同
、
1;在开始发送请求的时候把MBProgreessHud 展示模板,在block返回中隐藏模板。
2:在是同tableview 使用的是mvc模式 1:控制器只需要改变数据模型,然后更形界面,而不是直接修改界面的数据。
3:在tableview上头部加headview 的信息。头部信息的uiview是自定义
1:初始view的时候,加入子控件,并且指定子控件的fame ;指定的时候也是下一个的fram根据上一个控件的fram来指定。
2:我的关注的信息,来源要和下面的信息一致,即在下面block返回数据的时候,再次公布一个返回数据的方法,让子类去接收,然后子类拿到数据后,就可以设置头部信息。头部信息设置完成后,。
3:由于我的首页中可以跳转到“我的粉丝页面”,和“我的关注”页面,其中在头部要暴露出一个视图控制器属性,进行切换。,然后监听头部view的点击事件,把对应“粉丝”和“关注”的视图控制,押入到当前导航控制器。由于“粉丝”和“关注”视图控制器的中每一行,都可以跳到“自定的粉丝页面”,把粉丝页面押入进去。——》每次押入一个控制器,的时候,都是重新创建一个视图控制器,放入进去。

MySQL은 초보자가 데이터베이스 기술을 배우는 데 적합합니다. 1. MySQL 서버 및 클라이언트 도구를 설치하십시오. 2. SELECT와 같은 기본 SQL 쿼리를 이해하십시오. 3. 마스터 데이터 작업 : 데이터를 만들고, 삽입, 업데이트 및 삭제합니다. 4. 고급 기술 배우기 : 하위 쿼리 및 창 함수. 5. 디버깅 및 최적화 : 구문 확인, 인덱스 사용, 선택*을 피하고 제한을 사용하십시오.

MySQL은 테이블 구조 및 SQL 쿼리를 통해 구조화 된 데이터를 효율적으로 관리하고 외래 키를 통해 테이블 간 관계를 구현합니다. 1. 테이블을 만들 때 데이터 형식을 정의하고 입력하십시오. 2. 외래 키를 사용하여 테이블 간의 관계를 설정하십시오. 3. 인덱싱 및 쿼리 최적화를 통해 성능을 향상시킵니다. 4. 데이터 보안 및 성능 최적화를 보장하기 위해 데이터베이스를 정기적으로 백업 및 모니터링합니다.

MySQL은 웹 개발에 널리 사용되는 오픈 소스 관계형 데이터베이스 관리 시스템입니다. 주요 기능에는 다음이 포함됩니다. 1. 다른 시나리오에 적합한 InnoDB 및 MyISAM과 같은 여러 스토리지 엔진을 지원합니다. 2.로드 밸런싱 및 데이터 백업을 용이하게하기 위해 마스터 슬레이브 복제 기능을 제공합니다. 3. 쿼리 최적화 및 색인 사용을 통해 쿼리 효율성을 향상시킵니다.

SQL은 MySQL 데이터베이스와 상호 작용하여 데이터 첨가, 삭제, 수정, 검사 및 데이터베이스 설계를 실현하는 데 사용됩니다. 1) SQL은 Select, Insert, Update, Delete 문을 통해 데이터 작업을 수행합니다. 2) 데이터베이스 설계 및 관리에 대한 생성, 변경, 삭제 문을 사용하십시오. 3) 복잡한 쿼리 및 데이터 분석은 SQL을 통해 구현되어 비즈니스 의사 결정 효율성을 향상시킵니다.

MySQL의 기본 작업에는 데이터베이스, 테이블 작성 및 SQL을 사용하여 데이터에서 CRUD 작업을 수행하는 것이 포함됩니다. 1. 데이터베이스 생성 : createAbasemy_first_db; 2. 테이블 만들기 : CreateTableBooks (idintauto_incrementprimarykey, titlevarchar (100) notnull, authorvarchar (100) notnull, published_yearint); 3. 데이터 삽입 : InsertIntobooks (Title, Author, Published_year) VA

웹 응용 프로그램에서 MySQL의 주요 역할은 데이터를 저장하고 관리하는 것입니다. 1. MySQL은 사용자 정보, 제품 카탈로그, 트랜잭션 레코드 및 기타 데이터를 효율적으로 처리합니다. 2. SQL 쿼리를 통해 개발자는 데이터베이스에서 정보를 추출하여 동적 컨텐츠를 생성 할 수 있습니다. 3.mysql은 클라이언트-서버 모델을 기반으로 작동하여 허용 가능한 쿼리 속도를 보장합니다.

MySQL 데이터베이스를 구축하는 단계에는 다음이 포함됩니다. 1. 데이터베이스 및 테이블 작성, 2. 데이터 삽입 및 3. 쿼리를 수행하십시오. 먼저 CreateAbase 및 CreateTable 문을 사용하여 데이터베이스 및 테이블을 작성한 다음 InsertInto 문을 사용하여 데이터를 삽입 한 다음 최종적으로 SELECT 문을 사용하여 데이터를 쿼리하십시오.

MySQL은 사용하기 쉽고 강력하기 때문에 초보자에게 적합합니다. 1.MySQL은 관계형 데이터베이스이며 CRUD 작업에 SQL을 사용합니다. 2. 설치가 간단하고 루트 사용자 비밀번호를 구성해야합니다. 3. 삽입, 업데이트, 삭제 및 선택하여 데이터 작업을 수행하십시오. 4. Orderby, Where and Join은 복잡한 쿼리에 사용될 수 있습니다. 5. 디버깅은 구문을 확인하고 쿼리를 분석하기 위해 설명을 사용해야합니다. 6. 최적화 제안에는 인덱스 사용, 올바른 데이터 유형 선택 및 우수한 프로그래밍 습관이 포함됩니다.


핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

WebStorm Mac 버전
유용한 JavaScript 개발 도구

드림위버 CS6
시각적 웹 개발 도구

Atom Editor Mac 버전 다운로드
가장 인기 있는 오픈 소스 편집기

DVWA
DVWA(Damn Vulnerable Web App)는 매우 취약한 PHP/MySQL 웹 애플리케이션입니다. 주요 목표는 보안 전문가가 법적 환경에서 자신의 기술과 도구를 테스트하고, 웹 개발자가 웹 응용 프로그램 보안 프로세스를 더 잘 이해할 수 있도록 돕고, 교사/학생이 교실 환경 웹 응용 프로그램에서 가르치고 배울 수 있도록 돕는 것입니다. 보안. DVWA의 목표는 다양한 난이도의 간단하고 간단한 인터페이스를 통해 가장 일반적인 웹 취약점 중 일부를 연습하는 것입니다. 이 소프트웨어는

안전한 시험 브라우저
안전한 시험 브라우저는 온라인 시험을 안전하게 치르기 위한 보안 브라우저 환경입니다. 이 소프트웨어는 모든 컴퓨터를 안전한 워크스테이션으로 바꿔줍니다. 이는 모든 유틸리티에 대한 액세스를 제어하고 학생들이 승인되지 않은 리소스를 사용하는 것을 방지합니다.
