精华内容
下载资源
问答
  • 表视图

    千次阅读 2013-12-15 14:55:32
    在IOS中,一般情况下,我们都会以表的形式来展示...表视图最上边的视图,用于展示表视图的信息,如表视图刷新信息等。 (2)表脚视图。表视图最下边的视图,用于展示表视图的信息,如表视图分页时显示“更多”等信息。

    在IOS中,一般情况下,我们都会以表的形式来展示数据。在表视图中,分节、分组和索引功能使我们展示的数据看起来更规整。


    一、概述

    1、表视图组成

    在IOS中,表视图是最重要的视图。与表视图相关的一些概念如下:

    (1)表头视图。表视图最上边的视图,用于展示表视图的信息,如表视图刷新信息等。

    (2)表脚视图。表视图最下边的视图,用于展示表视图的信息,如表视图分页时显示“更多”等信息。

    (3)单元格(cell)。单元格是组成表视图每一行的单位视图。

    (4)节(section)。它由多个单元格组成,有节头和节脚。


    2、表视图相关类

    表视图继承自UIScrollView,UITableViewCell是单元格类,UITableViewController类是UITableView的控制器,UITableViewHeaderFooterView类用于节头和节脚提供视图(IOS6之后才有的新类)。下图是相关类的构成。



    3、表视图分类

    表视图主要分为普通视图(下左图)和分组视图(下右图)。

    (1)普通视图。主要用于动态表,而动态表一般在单元格数目未知的情况下使用。

    (2)分组视图。一般用于静态表,组将表分成很多部分(由一些类似的单元格组成)。静态表一般用于控件的界面布局,它是在IOS 5之后由storyboard提供的。

                             


    除此之外,在表视图中还可以带有索引、选择列和搜索栏等。


    4、单元格的组成和样式

    单元格由图标、标题和扩展视图等组成。


    单元格可以有很多样式,也可以自定义。图标、标题和副标题可以有选择地设置,扩展视图可以有内置或者自定义,其中内置的扩展视图是在枚举UITableViewCellAccessoryType中定义的。UITableViewCellAccessoryType中定义的常量有:

    (1)UITableViewCellAccessoryNone,没有扩展视图。

    (2)UITableViewCellAccessoryDisclosureIndicator,扩展指示器。触摸该图标将切换到下一级表视图。

    (3)UITableViewCellAccessoryDetailDisclosureButton,细节展示按钮。触摸该单元格的适合,表视图会以视图的方式显示当前单元格的更多详细信息。

    (4)UITableViewCellAccessoryCheckmark,选中标志。表示该行被选中。


    在实际的开发过程中,我们首先考虑apple提供的一些固有单元格样式。IOS API提供的单元格样式是在枚举UITableViewCellStyle中定义的。UITableViewCellStyle中定义的常量有:

    (1)UITableViewCellStyleDefault。默认样式,只有图标和主表土。

    (2)UITableViewCellStyleSubtitle。带有副标题的样式,有图标、主标题和副标题。

    (3)UITableViewCellStyleValue1。无图标带副标题样式1,有主标题和子标题。

    (4)UITableViewCellStyleValue2。无图标带副标题样式2,有主标题和子标题。


    如果以上单元格样式都不满足需求,我们可以考虑自定义。


    二、简单实现

    这里我们实现一个简单的表视图,其中单元格采用默认样式,有图标和主标题。


    有两个地方需要注意:

    1、Scene列表中选择TableView,打开表视图的属性检查器。可以看到Content下有两个选项(Dynamic Prototypes和Static Cells),这两个选项只有在storyboard中才有。Dynamic Prototype用于构建“动态表”,而Static Cells用于构建“静态表”。


    2、如果通过代码实现单元格的创建,则TableView的属性检查器中的Prototype Cells项要设为0;如果用视图文件创建单元格,则这里设为1。


    这里我们在代码中创建单元格,具体代码如下:


    //  ViewController.h
    
    #import <UIKit/UIKit.h>
    
    @interface ViewController : UITableViewController
    
    @property (strong,nonatomic) NSArray *data;
    @end
    


    //  ViewController.m
    
    #import "ViewController.h"
    
    @interface ViewController ()
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad
    {
        [super viewDidLoad];
        
        NSString *path=[[NSBundle mainBundle] pathForResource:@"team" ofType:@"plist"];
        self.data=[NSArray arrayWithContentsOfFile:path];
    }
    
    -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
    {
        return [self.data count];
    }
    
    -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {  
        static NSString *cellIdentifier=@"Cell";
        UITableViewCell *tableViewCell=[tableView dequeueReusableCellWithIdentifier:cellIdentifier];
        if(!tableViewCell){
            tableViewCell=[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
        }
        
        //根据indexPath获取相应的数据
        NSUInteger row=[indexPath row];
        NSDictionary  *dict=[self.data objectAtIndex:row];
        
        //设置cell的显示数据
        tableViewCell.textLabel.text=[dict objectForKey:@"name"];
        NSString *imgPath=[dict objectForKey:@"image"];
        imgPath=[imgPath stringByAppendingString:@".png"];
        UIImage *image=[UIImage imageNamed:imgPath];
        tableViewCell.imageView.image=image;
        
        //设置cell的扩展视图的样式
        tableViewCell.accessoryType=UITableViewCellAccessoryDisclosureIndicator;
        
        return tableViewCell;
    }
    
    @end
    

    如果利用storyboard中创建单元格,打开Table View Cell的属性检查器。Style选项中有很多可用属性,这些都与表视图描述的单元格的样式一致,Identifier是指可重用单元格的标识符。这样做之后,我们就不需要在代码中实例化单元格了。我们可以直接通过Identifier取得单元格的实例。下面是获取单元格的代码:

        static NSString *cellIdentifier=@"Cell";
        UITableViewCell *tableViewCell=[tableView dequeueReusableCellWithIdentifier:cellIdentifier];
    //    if(!tableViewCell){
    //        tableViewCell=[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
    //    }
        
    


    三、带搜索栏

    IOS提供了搜索栏控件,方便我们查询数据。这里我们在上面代码的基础上再实现搜索功能。


    1、IOS的搜索栏有很多样式:

    (1)基本搜索栏。

    (2)带清除按钮的搜索栏。

    (3)带查询结果按钮的搜索栏。


    显示最近搜索结果,事件响应由UISearchBarDelegate对象中的searchBarResultsListButtonClicked:方法管理。


    (4)带书签按钮的搜索栏。


    显示用户收藏的书签列表,事件响应由UISearchBarDelegate对象中的searchBarBookmarkButtonClicked:方法管理。


    (5)带取消按钮的搜索栏。


    事件响应由UISearchBarDelegate对象中的searchBarCancelButtonClicked:方法管理。


    (6)带Scope的搜索栏。


    事件响应由UISearchBarDelegate或UISearchDisplayDelegate对象管理。

    这里有一点需要注意,默认情况下,Scope Bar初始是显示的。这在iphone上用户体验比较差,我们需要让它初始隐藏,当SearchBar获取 焦点时再显示。为此,我们需要在初始化时调用SearchBar的两个方法:

    [searchBar setShowsScopeBar:NO];

    [searchBar sizeToFit];


    2、相对来说SearchBar是一个比较复杂的控件,它涉及到一些其它类:


    UISearchBarDelegate是UISearchBar的委托协议;UISearchDisplayController用于管理SearchBar并显示搜索结果视图,其事件处理由UISearchDisplayDelegate协议的委托对象来管理。


    3、我们用storyboard来设计我们的视图,这里有个小技巧:

    我们从对象库中拖拽的是Search Bar and Search Display Controller到界面,而不是Search Bar控件。前者的好处在于它可以把UISearchDisplayController也添加到搜索栏,并且将委托和数据源连线完毕。


    下面是我们的实现:

    //  ViewController.h
    
    #import <UIKit/UIKit.h>
    
    @interface ViewController : UITableViewController<UISearchBarDelegate,UISearchDisplayDelegate>
    @property (strong,nonatomic) NSArray *data;
    @property (strong,nonatomic) NSMutableArray *filterData;
    @property (weak, nonatomic) IBOutlet UISearchBar *searchBar;
    
    //根据text和选中的scope过滤数据
    -(void)filterDataWithText:(NSString*)text scope:(NSUInteger) scopeIndex;
    @end


    //  ViewController.m
    
    #import "ViewController.h"
    
    @interface ViewController ()
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad
    {
        [super viewDidLoad];
        //设置搜索栏的ScopeBar初始隐藏
    	[self.searchBar setShowsScopeBar:NO];
        [self.searchBar sizeToFit];
        
        NSString *path=[[NSBundle mainBundle] pathForResource:@"team" ofType:@"plist"];
        self.data=[NSArray arrayWithContentsOfFile:path];
        //加载所有数据
        [self filterDataWithText:@"" scope:-1];
    }
    
    -(void)filterDataWithText:(NSString *)text scope:(NSUInteger)scopeIndex
    {
        if([text length]==0){
            self.filterData=[NSMutableArray arrayWithArray:self.data];
            return;
        }
        NSPredicate *predicate;
        switch (scopeIndex) {
            case 0:
                //按中文查询
                predicate=[NSPredicate predicateWithFormat:@"SELF.name contains[c] %@",text];
                self.filterData=[NSMutableArray arrayWithArray:[self.data filteredArrayUsingPredicate:predicate]];
                break;
            case 1:
                //按英文查询
                predicate=[NSPredicate predicateWithFormat:@"SELF.image contains[c] %@",text];
                self.filterData=[NSMutableArray arrayWithArray:[self.data filteredArrayUsingPredicate:predicate]];
                break;
                
            default:
                //默认查询所有
                self.filterData=[NSMutableArray arrayWithArray:self.data];
                break;
        }
    }
    
    
    -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
    {
        return [self.filterData count];
    }
    
    -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        static NSString *cellIdentifier=@"Cell";
        UITableViewCell *tableViewCell=[tableView dequeueReusableCellWithIdentifier:cellIdentifier];
        if(!tableViewCell){
            tableViewCell=[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:cellIdentifier];
        }
        
        //根据indexPath获取相应的数据
        NSUInteger row=[indexPath row];
        NSDictionary  *dict=[self.filterData objectAtIndex:row];
        
        //设置cell的显示数据
        tableViewCell.textLabel.text=[dict objectForKey:@"name"];
        NSString *imgPath=[dict objectForKey:@"image"];
        tableViewCell.detailTextLabel.text=imgPath;
        imgPath=[imgPath stringByAppendingString:@".png"];
        UIImage *image=[UIImage imageNamed:imgPath];
        tableViewCell.imageView.image=image;
        
        //设置cell的扩展视图的样式
        tableViewCell.accessoryType=UITableViewCellAccessoryDisclosureIndicator;
        return tableViewCell;
    }
    
    -(BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString
    {
        [self filterDataWithText:searchString scope:self.searchBar.selectedScopeButtonIndex];
        return YES;
    }
    
    -(BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchScope:(NSInteger)searchOption
    {
        [self filterDataWithText:self.searchBar.text scope:searchOption];
        return YES;
    }
    
    -(void)searchBarCancelButtonClicked:(UISearchBar *)searchBar
    {
        [self filterDataWithText:@"" scope:-1];
    }
    
    @end
    


    在搜索栏中输入查询条件,会触发UISearchBarDelegate委托对象的searchBar:textDidChange:方法和UISearchDisplayDelegate委托对象的searchDisplayController:shouldReloadTableForSearchString:方法,我们只要实现这两者之一即可。这里我们选择实现后者,因为后者的优势在于可以控制表视图数据源是否重新加载。如果实现searchBar:textDidChange:方法,则我们还需要自己调用[tableView reloadData]方法重新加载表视图数据。


    ScopeBar进行切换时,会触发UISearchBarDelegate委托对象的searchBar:selectedScopeButtonIndexDidChange:方法和UISearchDisplayDelegate委托对象的searchDisplayController:shouldReloadTableForSearchScope:方法,我们也只要实现两者之一即可。这里我们同样选择实现后者,因为后者能控制表视图数据源是否重新加载。


    四、分节和索引


    当表中的数据需要归类时,我们会用到节;当表中数据量比较大时,我们还可以建立索引。下面是一个简单的实现。


    1、数据组织



    这里我们在Dictionary中存放Array,每个Array为一个节。


    具体实现:

    //  ViewController.h
    
    #import <UIKit/UIKit.h>
    
    @interface ViewController : UITableViewController
    
    @property (nonatomic,strong) NSDictionary *data;
    @property (nonatomic,strong) NSArray *groupName;
    
    @end


    //  ViewController.m
    
    #import "ViewController.h"
    
    @interface ViewController ()
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad
    {
        [super viewDidLoad];
    	
        //获取所有数据
        self.data=[NSDictionary dictionaryWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"team_dictionary" ofType:@"plist"]];
        //获取组名
        NSArray *temp=[self.data allKeys];
        //从哈希表中获取的数据是无序的,所以需要排序
        self.groupName=[temp sortedArrayUsingSelector:@selector(compare:)];
       
    }
    
    //定义表中的节数
    -(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
    {
        return [self.groupName count];
    }
    
    //定义节头显示字符串
    -(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
    {
        return [self.groupName objectAtIndex:section];
    }
    
    //定义节索引
    -(NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView
    {
        NSMutableArray *sectionIndexArray=[[NSMutableArray alloc] initWithCapacity:[self.groupName count]];
        for(NSString *temp in self.groupName){
            NSString *indexTitle=[temp substringToIndex:1];
            [sectionIndexArray addObject:indexTitle];
        }
        return sectionIndexArray;
    }
    
    //定义节中的行数
    -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
    {
        NSString *group=[self.groupName objectAtIndex:section];
        NSArray *temp=[self.data objectForKey:group];
        return [temp count];
    }
    
    //定义单元格
    -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        static NSString *cellIdentifier=@"cell";
        UITableViewCell *cell=[tableView dequeueReusableCellWithIdentifier:cellIdentifier];
        if(!cell){
            cell=[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:cellIdentifier];
        }
        
        //获取节
        NSUInteger section=[indexPath section];
        NSUInteger row=[indexPath row];
        //获取组名
        NSString *group=[self.groupName objectAtIndex:section];
        //获取组中的数据
        NSArray *temp=[self.data objectForKey:group];
        
        cell.textLabel.text=[temp objectAtIndex:row];
        
        return cell;
    }
    
    
    @end
    


    五、编辑表视图

    TableView的编辑包括:insert、delete和move。

    //  ViewController.m
    
    #import "ViewController.h"
    
    @interface ViewController ()
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad
    {
        [super viewDidLoad];
        
        self.tableView.delegate=self;
        self.tableView.dataSource=self;
        self.textField.delegate=self;
        //设置NavigationItem的右按钮以及title
    	self.navigationItem.rightBarButtonItem=self.editButtonItem;
        self.navigationItem.title=@"TableView Editing";
        //初始隐藏TextField
        self.textField.hidden=YES;
        
        self.data=[[NSMutableArray alloc] initWithObjects:@"Houston",@"New York",@"Los Angeles",@"Boston",@"Miami",@"Washington", nil];
    }
    
    /*
     Sets whether the view controller shows an editable view.
     Subclasses that use an edit-done button must override this method to change their view to an editable state if editing is YES and a non-editable state if it is NO. This method should invoke super’s implementation before updating its view.
     */
    -(void)setEditing:(BOOL)editing animated:(BOOL)animated
    {
        [super setEditing:editing animated:YES];
        
        [self.tableView setEditing:editing animated:YES];
        if(editing){
            self.textField.hidden=NO;
        }else{
            self.textField.hidden=YES;
        }
    }
    
    //Asks the delegate for the editing style of a row at a particular location in a table view.
    -(UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        if(indexPath.row==[self.data count]){
            return UITableViewCellEditingStyleInsert;
        }else{
            return UITableViewCellEditingStyleDelete;
        }
    }
    
    //Asks the data source to commit the insertion or deletion of a specified row in the receiver.
    -(void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
    {
        if(editingStyle==UITableViewCellEditingStyleDelete){//delete
            [self.data removeObjectAtIndex:indexPath.row];
            [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
        }else if(editingStyle==UITableViewCellEditingStyleInsert){//insert
            [self.data insertObject:self.textField.text atIndex:[self.data count]];
            [tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
        }
        [tableView reloadData];
    }
    
    //Asks the data source whether a given row can be moved to another location in the table view.
    -(BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath
    {
        if(indexPath.row==[self.data count]){
            return NO;
        }
        return YES;
    }
    
    //Tells the data source to move a row at a specific location in the table view to another location.
    -(void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath
    {
        NSString *str=[self.data objectAtIndex:sourceIndexPath.row];
        [self.data removeObjectAtIndex:sourceIndexPath.row];
        [self.data insertObject:str atIndex:destinationIndexPath.row];
    }
    
    -(BOOL)tableView:(UITableView *)tableView shouldHighlightRowAtIndexPath:(NSIndexPath *)indexPath
    {
        if(indexPath.row==[self.data count]){
            return NO;
        }
        return YES;
    }
    
    //Asks the delegate if the text field should process the pressing of the return button.
    -(BOOL)textFieldShouldReturn:(UITextField *)textField
    {
        [textField resignFirstResponder];
        return YES;
    }
    
    //Tells the delegate that editing began for the specified text field.
    //设置tableview内容的offset,以免文本框被键盘挡住
    -(void)textFieldDidBeginEditing:(UITextField *)textField
    {
        UITableViewCell *cell=(UITableViewCell*)[[textField superview] superview];
        [self.tableView setContentOffset:CGPointMake(0.0, cell.frame.origin.y) animated:YES];
    }
    
    -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
    {
        return [self.data count]+1;
    }
    
    -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        static NSString *cellIdentifier=@"cell";
        UITableViewCell *cell=[tableView dequeueReusableCellWithIdentifier:cellIdentifier];
        if(!cell){
            cell=[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
        }
        if([indexPath row]==[self.data count]){
            self.textField.frame=cell.contentView.frame;
            self.textField.text=@"";
            [cell.contentView addSubview:self.textField];
        }else{
            cell.textLabel.text=[self.data objectAtIndex:[indexPath row]];
            cell.accessoryType=UITableViewCellAccessoryDisclosureIndicator;
        }
           return cell;
    }
    
    @end
    


    setEditing:animated:方法是UIViewController生命周期方法,用于响应视图编辑状态的变化。在我们这里,当点击NavigationItem上的Edit(这个编辑按钮是视图控制器中预定义的按钮,点击后按钮会转换到Done)时便会触发setEditing:animated:方法。在这个方法里,我们触发TableView的编辑方法。 


    tableView:commitEditingStyle:forRowAtIndexPath:方法是TableView的编辑提交方法,我们编辑完成后,点击NavigationItem上的Done便会触发该方法。


    在处理键盘遮挡输入框时,有一点需要注意,


    这里textField的父亲的父亲才是UITableViewCelltextField的父亲是单元格内容视图,并不是UITableViewCell。


    tableView:canMoveRowAtIndexPath:控制cell是否可移动,我们这里除了最后一条(最后一条是添加item选项),都能移动。cell移动时,我们需要在tableView:moveRowAtIndexPath:toIndexPath:方法中做相应的处理。


    下面是运行截图:

                        


    六、自定义UITableViewCell

    iOS提供了几种cell的样式,实际应用中经常需要根据需求自定义cell。自定义的方式有多种,这里介绍两种方式。第一种,新建一个cell类(不带xib),并继承UITableViewCell,然后在类中用代码添加view,这种方式会稍微麻烦一点。第二种,新建一个cell类,附带xib(xib中的根view不是UIView,而是TableViewCell),指定cell的复用id,类继承UITableViewCell,然后在xib中添加view。


    上面提到两种自定义TableViewCell的方式,接下来还有一个复用的问题。第一种方式自定义的TableViewCell在使用的时候与使用系统的cell一样,先调用tableview的dequeueReusableCellWithIdentifier方法获取复用,如果为nil,直接调用alloc创建并初始化一个复用id;第二种方式自定义的TableViewCell在使用的时候稍微有点不一样,首先在viewDidLoad方法中注册Nib:

    UINib *nib = [UINib nibWithNibName:@"MusicPickerViewCell" bundle:nil];
        [self.tableView registerNib:nib forCellReuseIdentifier:cellIdentifier];

    注册之后,在

    -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    方法中直接获取复用cell即可(不需要判断nil):

    MusicPickerViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];








    展开全文
  • MySQL创建表视图及多表视图

    千次阅读 2020-09-25 14:02:02
    MySQL视图(View)是一种虚拟的,同真实的一样,拥有相同的行和列 ,但视图并不实际存在于数据库中,而是在你使用的时候去动态的查询,view的行和列都是基于你使用view的时候动态的去查询的数据而生成视图 数据库只...

    MySQL视图(View)是一种虚拟的表,同真实的表一样,拥有相同的行和列
    ,但视图并不实际存在于数据库中,而是在你使用的时候去动态的查询表,view的行和列都是基于你使用view的时候动态的去查询表的数据而生成视图
    数据库只存view的定义并没有存放view的数据
    在你使用视图(view)时,数据库会从真实表内取出view所对应的数据
    也就是说view是的数据是完全依赖于真实表的数据,当真实表的数据发送修改,删除,使用视图(view)查询到的虚拟表也将会是被修改删除后的数据
    基于单表创建视图

    #创建学生表
    create table Student(Sid varchar(6), Sname varchar(10), Sage datetime, Ssex varchar(10));
    #插入数据
    insert into Student values('01' , '赵雷' , '1990-01-01' , '男');
    insert into Student values('02' , '钱电' , '1990-12-21' , '男');
    insert into Student values('03' , '孙风' , '1990-05-20' , '男');
    #基于单表创建视图
    create view  <视图名> as <select语句>
    create view view_stuent_info as select `st`.s_id`, `st`.`s_name` from student ;
    

    基于多表创建视图

    #创建成绩表
    create table SC(Sid varchar(10), Cid varchar(10), score decimal(18,1));
    insert into SC values('01' , '01' , 80);
    insert into SC values('01' , '02' , 90);
    insert into SC values('01' , '03' , 99);
    insert into SC values('02' , '01' , 70);
    insert into SC values('02' , '02' , 60);
    insert into SC values('02' , '03' , 80);
    insert into SC values('03' , '01' , 80);
    insert into SC values('03' , '02' , 80);
    insert into SC values('03' , '03' , 80);
    #基于多表创建视图
    create view <视图名> as 查询语句 表12
    create view view_student_score as select `st`.`s_id`,`sc`.`s_score` 
    from student st left join score sc 
    on `st`.`s_id` = `sc`.`s_id`
    where `st`.`s_sex` = '男';
    
    展开全文
  • 表视图学习

    千次阅读 2012-03-07 11:37:00
    在iPhone中,表视图是iPhone上的一个列,多个行的表;用户可以上下滚动来查看更多的数据。从用户的角度来看,创建一个表视图就是完成下面三个功能: 创建表视图为每一行提供文本或图像当用户选择某一行时,做出...

    一、概述

    我们经常需要显示大量数据,比如iPhone内置的通讯录应用。UITableView是UIScrollView的子类。在iPhone中,表视图是iPhone上的一个列,多个行的表;用户可以上下滚动来查看更多的数据。从用户的角度来看,创建一个表视图就是完成下面三个功能:

    • 创建表视图
    • 为每一行提供文本或图像
    • 当用户选择某一行时,做出响应

    一个表视图必须有个一个数据源,这是通过UITableViewDataSource协议来完成的。另外表视图通过UITableViewDelegate协议来实现表视图上的操作。一般而言,你会创建一个UITableViewController的子类,然后在这个子类上实现数据源和表视图的操作。

    1.1 表视图的类型

    表视图的显示风格分为两类:

    1、不分组的显示---UITableViewStylePlain

    2、分组的显示---UITableViewStyleGrouped

    对于分组的结构,每组叫做section,在section的每一行叫做表单元(Table Cell)


    二、UITableView的常用方法


    2.1 初始化一个表视图的方法

    - (id)initWithFrame:(CGRect)frame style:(UITableViewStyle)style ;

    2.2 表视图的相关配置方法

    - (UITableViewCell *)dequeueReusableCellWithIdentifier:(NSString *)identifier ;//根据唯一标识,查找可重用表视图单元(UITableViewCell)对象

    - (NSInteger)numberOfRowsInSection:(NSInteger)section ;//返回指定section的表视图行数

    - (NSInteger)numberOfSections ;//返回表视图中的section数目

    2.3 访问section和表单元(UITableViewCell)

    - (UITableViewCell *)cellForRowAtIndexPath:(NSIndexPath *)indexPath ;//返回指定NSIndexPath的表单元,NSIndexPath对象代表一个嵌套数组集合特定节点路径这条道路被称为索引路径。此处只要将NSIndexPath理解为一个可代表表单元位置的一个路径,根据这个NSIndexPath路径,可用定位到对应的表单元。

    - (NSIndexPath *)indexPathForCell:(UITableViewCell *)cell ;//返回指定表单元的NSIndexPath路径信息

    - (NSIndexPath *)indexPathForRowAtPoint:(CGPoint)point;//返回指定了CGPoint的NSIndexPath路径信息

    - (NSArray *)indexPathsForRowsInRect:(CGRect)rect;//返回指定CGRect的NSIndexPath路径信息数组


    - (NSArray *)visibleCells;//返回可见的表单元(UITableViewCell)数组


    - (NSArray *)indexPathsForVisibleRows;//返回可见的表单元的NSIndexPath路径信息数组

    2.4 管理section

    - (NSIndexPath *)indexPathForSelectedRow;//返回选中行的NSIndexPath路径信息


    - (void)selectRowAtIndexPath:(NSIndexPath *)indexPath animated:(BOOL)animated scrollPosition:(UITableViewScrollPosition)scrollPosition;//

    - (void)deselectRowAtIndexPath:(NSIndexPath *)indexPath animated:(BOOL)animated;//

    2.5 插入和删除表单元(UITableViewCell)

    - (void)beginUpdates

    - (void)endUpdates


    - (void)insertRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation


    - (void)deleteRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation


    - (void)insertSections:(NSIndexSet *)sections withRowAnimation:(UITableViewRowAnimation)animation


    - (void)deleteSections:(NSIndexSet *)sections withRowAnimation:(UITableViewRowAnimation)animation


    - (void)setEditing:(BOOL)editing animated:(BOOL)animate

    2.6 表视图数据的加载

    - (void)reloadData

    - (void)reloadRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation


    - (void)reloadSections:(NSIndexSet *)sections withRowAnimation:(UITableViewRowAnimation)animation


    - (void)reloadSectionIndexTitles



    展开全文
  • IOS中的高级控件表视图 第一步:同样是拖入控件,并对其数据源进行连线所以我就直接拿上一张的图片就不截图了。 如果有不明白的请点击连接 010 在Xcode4.5上创建IOS6.0应用 (高级控件 表视图 基本表视图) ...

    IOS中的高级控件表视图


    第一步:同样是拖入控件,并对其数据源进行连线所以我就直接拿上一张的图片就不截图了。
    如果有不明白的请点击连接



    第二步:对H文件进行编辑实现表格控件的协议
    ViewController.h
    @interface ViewController : UIViewController
    <UITableViewDataSource,UITableViewDelegate>{
        NSDictionary *dictionary;
        NSArray *arr;
    }
    
    @property(nonatomic,retain)NSDictionary *dictionary;
    @property(nonatomic,retain)NSArray *arr;
    
    @end


    ViewController.m
    @implementation ViewController
    
    @synthesize dictionary;
    @synthesize arr;
    
    
    //实现表示图的方法
    -(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
        
        
        NSUInteger section = [indexPath section];
        NSUInteger row = [indexPath row];
        
        NSString *name = [arr objectAtIndex:section];
        NSArray *team = [dictionary objectForKey:name];
        NSString *selectedteam = [team objectAtIndex:row];
        
        NSString *message = [[NSString alloc] initWithFormat:@"你选择的号码是%@",selectedteam];
        
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"球队选择"
                                                        message:message delegate:self
                                              cancelButtonTitle:@"OK"
                                              otherButtonTitles:nil, nil];
        
        
        [alert show];
        [alert release];
        [message release];
        //实现点击时,让点击的那个选中慢慢消失
        [tableView deselectRowAtIndexPath:indexPath animated:YES];
        
    }
    
    //实现索引
    -(NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView{
        return arr;
    }
    
    -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
        //返回段里面有几行
        NSString *name = [arr objectAtIndex:section];
        NSArray *team = [dictionary objectForKey:name];
        
        return [team count];
    }
    //返回数量
    -(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
        return [arr count];
    }
    //返回每个段里面的名字
    -(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section{
        NSString *name = [arr objectAtIndex:section];
        return name;
    }
    
    
    -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
        static NSString *CellIdentifier = @"Cell";
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
        if (cell == nil) {
            cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
        }
        
        NSUInteger section = [indexPath section];
        NSUInteger row = [indexPath row];
        NSString *name = [arr objectAtIndex:section];
        NSArray*team = [dictionary objectForKey:name];
        
        //返回协议的标题
        cell.textLabel.text = [team objectAtIndex:row];
        
        return cell;
        
    }
    
    
    
    
    
    
    
    
    
    
    
    - (void)viewDidLoad
    {
        [super viewDidLoad];
    	//下面为模式代码读取文件到代码中
        NSBundle *bundle = [NSBundle mainBundle];
        NSString *filePath = [bundle pathForResource:@"statedictionary" ofType:@"plist"];
        NSDictionary *dic = [[NSDictionary alloc] initWithContentsOfFile:filePath];
        self.dictionary = dic;
        [dic release];
        //根据ID查询字典里面的内容并进行排序
        self.arr = [[dictionary allKeys] sortedArrayUsingSelector:@selector(compare:)];
    }
    
    - (void)didReceiveMemoryWarning
    {
        [super didReceiveMemoryWarning];
        // Dispose of any resources that can be recreated.
    }
    
    - (void)dealloc
    {
        [dictionary release];
        [arr release];
        [super dealloc];
    }
    
    @end

    最后我门就实现了分段表视图


    实现分组表视图必须再分段表视图的基础上
    只需要修改一个属性



    大家都看到上面的视图上面都有一个索引实现起来也比较简单只要实现这段小小的代码
    -(NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView{
        return arr;
    }




    展开全文
  • IOS 分节表视图

    2015-07-13 22:19:23
    分节表视图,一个表可以有多个节,节也有头有脚,分节是添加索引和分组的前提。
  • 表视图的创建

    千次阅读 2010-11-08 17:05:00
    表视图(UITableView)是一种极其常见的视图,在各种含选择功能的程序中用到,如本次的实验室之家中大量运用表视图。运用表视图可以轻松的进行选择。 表视图并不负责存储表中的数据,他只负责存储足够绘制当前可见...
  • hive上创建表视图

    千次阅读 2017-04-25 14:50:25
    数据仓库中对有些表采用全量分区,每天一个历史镜像数据,有些数据应用系统正好使用该类型表,可以对外输出一个表视图使数据消费方不用关心是何种类型的表,在workflow中每天定时重建该视图,还可以屏蔽调度数据失败...
  • Oracle 多表视图更新

    2012-11-21 17:35:49
    表视图的定义:当视图的数据源只有一张数据表,则该视图为单表视图;当视图的数据源是多张数据表,则该视图为多表视图。 可更新视图的定义:在绝大多数人的概念中,视图是只读的,不允许修改。ORACLE 8i以上版本...
  • 表视图的基本概念和用法

    千次阅读 2014-06-10 15:24:36
    1、表视图的基本概念
  • iOS开发那些事--简单表视图

    千次阅读 2013-02-27 16:17:18
    表视图是iOS开发中使用最频繁的视图,我们一般都会选择以表的形式来展现数据,比如通讯录、频道列表等。表视图分段、分组、索引等功能使我们所展示的数据看起来更规整更有调理,更令人兴奋的是表视图还可以利用细节...
  • 首先需要创建.plist的文件,包含所有的信息,便于表视图加载过程中数据的录入。用字典存储,以数组的方式获取表视图的数据。遵循UITableViewDelegate协议实现对表视图的分区。 在.h文件中添加协议,创建对象: @...
  • IOS UITableView 表视图的绝大部分方法

    千次阅读 2013-12-17 22:00:42
    UITableView表视图的绝大部分方法 //初始化一个 表视图 1、- (id)initWithFrame:(CGRect)frame style:(UITableViewStyle)style 初始化一个表视图,区域和类型 //配置表视图 2、- (NSInteger)...
  • IOS学习笔记(十二)之IOS开发之表视图(UITableView)的讲解与使用(二)(博客地址:http://blog.csdn.net/developer_jiangqq)转载请注明地址. ... 上一篇初步学习了一下表视图(UITableView)的基本概念内容
  • iOS开发那些事-表视图UI设计模式

    千次阅读 2013-03-05 13:18:14
    由于表视图的应用在iOS中极其广泛,本节向大家介绍表视图中两个UI设计模式:分页模式和下拉刷新(Pull-to-Refresh)模式。这两种模式已经成为移动平台开发的标准。 分页模式  分页模式规范了移动平台进行大量...
  • 表视图样式和扩展视图 原文链接 表视图根据特殊的需求可以创建不通的样式。另外,UIKit框架提供一些标准样式来绘制各个单元格。 表视图样式: 表视图主要分为两种样式:plain类型和grouped类型。从呈现形式上...
  • 第三节、整理表视图的代码

    千次阅读 2014-05-17 18:38:18
    CSDN博客: forlong401 ... 微博:@forlong401 ...因此,大量的代码是直接或间接与表视图任务相关,包括提供数据、更新表视图、控制其行为和反应选择等,但这些也仅仅是其中一部分任务。在本文中,我们将
  • UITableView表视图和导航控制器的交互使用 现在要实现这么一个功能, 在一个导航控制器中的根视图是一个表视图UITableView,然后点击这个表视图中的某行时, 会跳转到另一个相应的视图中。 1、首先要把这个导航...
  • IOS学习八:UITableView表视图控件初步

    万次阅读 2012-05-04 18:03:36
    表视图这个控件学习的时候,发现是目前我接触到最复杂的组件。 在Android中也提供了类似表视图的控件叫ListView。 原生的ListView,支持的操作其实很有限,数据的条目展示,点击或是长按的操作。 后来慢慢的衍生...
  • 创建TCODE维护表视图

    千次阅读 2009-04-30 17:41:00
    下面以维护一个表视图为例。视图已经创建好。 1.初始界面 输入TCODE: SE93。点击新建,输入描述信息,注意有事务一栏,输入维护视图的TCODE:SM30。 2.起始屏幕 将跳过初始屏幕的复选框选中,如图: 如果不选中跳过...
  • iPhone开发应用之表视图学习案例 1、概念 表视图是用于向用户显示数据列表的一种最常见的机制,它们是高度可配置的对象,可以呗配置为用户所需的任何形式。iPhone可以只有一列 2、表视图基础 表...
  • 表视图的定义:当视图的数据源只有一张数据表,则该视图为单表视图;当视图的数据源是多张数据表,则该视图为多表视图。  可更新视图的定义:在绝大多数人的概念中,视图是只读的,不允许修改。ORACLE 8i以上...
  • 【1】视图的定义视图:view,是一种有结构(有行有列)但是没结果(结构中不真实存放数据)的虚拟,虚拟的结构来源不是自己定义,而是从对应的基表中产生(视图的数据来源) 创建视图后会自动从基表里面拉取数据到视图...
  • oracle多表视图更新

    千次阅读 2007-04-04 23:05:00
    但有时候为了操作的方便我们更希望能够对多表视图也进行更新。这时候我们可以通过建立更新触发器来替代该视图原有更新以达到多表更新的效果例如:3.1 创建测试数据表 --===========================================...
  • 表视图的作用

    千次阅读 2012-08-24 10:40:59
    视图可以将多种相互关联起来,将数据集成一张虚拟视图更多的时候是方便我们查询数据用,一般是根据相互关联的的数据的变动而动态改变。这是创建的语句:create table WF_framework (  GROUPID...
  • 前言 在IOS中,UITableViewController不如UIViewController用的方便,遇到了一个需求:在TableView中添加一个悬浮按钮,不随TableView...可是在表视图控制器中,就很难办,因为控制器中没有作为tableView的父视图的vie
  • ios应用开发当中的表视图 原文链接 表视图是一种在ios应用开发当中很常见的用户界面对象。它是以滚动的形式展现多行数据的列表,而且这些列表可以划分好多个节(也可理解为块或区域)。   表视图的作用:  让...
  • 既然如此那么我们就能够知道,在表格下拉的过程中,需要让头部的图片能够有稍微放大的效果出现,我们可以根据滚动视图滚动监听事件,通过获取表格下拉的拉伸量,从而去改变图片的大小即可!所以: /** * 关键处理:...
  • 导航控制器和表视图(二)

    千次阅读 2012-07-16 19:45:49
    本文是在 导航控制器和表视图(一) 添加代码,实现的和 UITableViewCell的标记、移动、删除、插入,不同的是把他们分别放在不同单元格视图中,只要就是委托方法的使用,此处不在分析全部代码,但提供全部代码...
  • 一般来说,多表视图在Form是不可以直接更新的。但是视图有其方便性(就是可以串出很多需要的栏位,不需要在Form的Post-query或者其他触发器中特别写代码赋值), 所以很多时候我们需要Form可以实现从视图直接更新...
  • 查询系统下的所有表视图

    千次阅读 2017-11-30 23:36:55
    – 查询所有用户的,视图等select * from user_tab_comments – 查询本用户的,视图等 select * from all_col_comments –查询所有用户的的列名和注释.select * from user_col_comments – 查询本用户的的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 513,962
精华内容 205,584
关键字:

表视图