10

Hello I am using One tab bar button on toolbar , this button will show next view with table view ,Here is my code

[self presentModalViewController:self.navigationController
                            animated:YES];

my problem is that when I click this tab bar button it will showing next view with tableview but not navigation bar. because of this i am unable to perform delete operation in tableView.

How to solve the issue?

iProgrammer
  • 3,099
  • 3
  • 33
  • 59

7 Answers7

37

If you dont find the UINavigationBar on the next class means , it does not have a navigation controller, so before pushing it add a UINavigationController to your next view.

Try like this:

NextViewController *nextViewController=[[NextViewController alloc]initWithNibName:@"NextViewController" bundle:nil];
UINavigationController *navBar=[[UINavigationController alloc]initWithRootViewController:nextViewController];
[self.navigationController presentModalViewController:navBar animated:YES];
[navBar release];
[nextViewController release];

see this stackoverflow question for edit option.

You can simply add a button to navigation bar with ease

self.navigationItem.rightBarButtonItem = [[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(editTable)] autorelease];

-(void)editTable{
[tableView setEditing: YES animated: YES];
}

All the best.

Community
  • 1
  • 1
Warrior
  • 39,156
  • 44
  • 139
  • 214
  • self.navigationItem.rightBarButtonItem = self.editButtonItem; this is showing EditButton item,,Now how to call Editing method of tableview – iProgrammer May 19 '11 at 11:00
  • Ok Working fine with Edit and done button.And deleting record also but It is deleting temporary.When start my app again then records are still there – iProgrammer May 19 '11 at 11:05
  • -(void)tableView:(UITableView *)atableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath { if (editingStyle == UITableViewCellEditingStyleDelete) { [bookmarks removeObjectAtIndex:indexPath.row]; [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObjects:indexPath, nil] withRowAnimation:UITableViewRowAnimationFade]; [[NSUserDefaults standardUserDefaults] setObject:bookmarks forKey:@"Bookmarks"]; } } – iProgrammer May 19 '11 at 11:06
  • +1 You sir have saved my programming day! totally needed this. my views were acting really funny when trying to add a subview.. so did present modal view controller instead.. but had no navigation controller... saw your post first and woosh it worked nicely! thanks for sharing. – Pavan Sep 03 '12 at 22:14
3

This code is called on button click event in classA VC:

ClassBVC* bVc = [[ClassBVC alloc] initWithNibName:@"ClassBVC" bundle:nil];
     UINavigationController* tempNavCon = [[UINavigationController alloc]    initWithRootViewController:bVc];
    [self presentModalViewController:tempNavCon animated:YES];
    [tempNavCon release];
    [bVc release];
    bVc = nil

;

and in class BVC in view did load you make an UIbarbutton item e.g:

UIBarButtonItem* barButton = [[UIBarButtonItem alloc] initWithTitle:@"Back" style:UIBarButtonItemStylePlain target:self action:@selector(backButtonClicked:)];
    [barButton setTitle:@"Back"];
    [self.navigationItem setLeftBarButtonItem:barButton];
    [barButton release];

And in buttonClickedMethod simply dismiss the the model controller as:

-(void)backButtonClicked:(id)sender
{
    [self dismissModalViewControllerAnimated:YES];
}
Himanshu Agnihotri
  • 2,360
  • 4
  • 23
  • 30
1

That is because you are using Modal to bring the new view controller.

Modally added/presented view controller will not be added to the navigation controller stack

Pramodh
  • 199
  • 1
  • 10
0

Swift 5

 import UIKit

class ListVC: UIViewController {


    // MARK: - Init
    override func viewDidLoad() {
           super.viewDidLoad()

        //Background of the first screen
        view.backgroundColor = .yellow

        //Calling the instance of the navigation controller
        let nav = self.navigationController?.navigationBar

        //Defining the black theme on the navigation controller
        nav?.barStyle = UIBarStyle.black

        //Defining the white characters to make contrast with the black theme on the navigation controller
        nav?.tintColor = UIColor.white

        //Defining the custom color of the title font from navigation controller
        nav?.titleTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.orange]

        //Defining the title of the navigation controller
        nav?.topItem?.title = "List"

        navigationItem.rightBarButtonItem = UIBarButtonItem.init(image: #imageLiteral(resourceName: "AddBtn"), style: .plain, target: self, action: #selector(hello))



//        print(Realm.Configuration.defaultConfiguration.fileURL)

           let realm = try! Realm()

           print(Realm.Configuration.defaultConfiguration.fileURL)

       }


    // MARK: - Selector

    /// A selector function that is called when the 'add' button is pressed on the navigation controller
    @objc func hello() {

        //Instance of the second screen
        let addVC = AddVC()

        //Add the navigationController to the new viewController
        let navController = UINavigationController(rootViewController: addVC)

        //Presenting the second screen modally
        navigationController?.present(navController, animated: true, completion: nil)
    }


}
//Other class
import UIKit

class AddVC: UIViewController {


    override func viewDidLoad() {
        super.viewDidLoad()

        //Background of the view
        view.backgroundColor = .white

        //Calling the instance of the navigation controller
        let nav = self.navigationController?.navigationBar

        //Initialize the title for the ViewController
        nav?.topItem?.title = "Andrey"

        // Initialize the right bar button item
        navigationItem.rightBarButtonItem = setUpSaveButton()
    }

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        self.navigationController?.setNavigationBarHidden(false, animated: true)
    }

    /// Function that returns the "Save" bar button item
    private func setUpSaveButton() -> UIBarButtonItem {
        let button = UIBarButtonItem(title: "Save", style: .plain, target: self, action: #selector(saveAction))
        button.setTitleTextAttributes([NSAttributedString.Key.foregroundColor: UIColor.systemBlue],
                                      for: .normal)

        return button
    }

    @objc func saveAction() {
        print("Saving..")
    }
}

Marlhex
  • 1,870
  • 19
  • 27
0

if you are using navigationcontroller use like this

[self.navigationController pushViewController:nextController animated:YES];
0

Add navigation bar as sub view to the new view with bar button.

Try this

-(IBAction) editClick:(id)sender
{
    [tableView setEditing:![tableView isEditing]  animated:YES];
}
nambi
  • 547
  • 3
  • 10
0

Swift 5.1 Presenting ViewController with navigation bar AND toolbar in fullscreen mode. If you don't put the row marked on comment the toolbar never show itself.

let sb = UIStoryboard(name: "retail_mainScreen", bundle: nil)
        guard let mainVC = sb.instantiateViewController(withIdentifier: "mainScreen") as? retail_mainGest else { return }
        let navController = UINavigationController(rootViewController: mainVC)
        navController.isToolbarHidden = false //<--- remember this or toolbar will not appear
        navController.modalPresentationStyle = .fullScreen

         sender.vista.present(navController, animated: true, completion: nil)
Massimo Pavanel
  • 754
  • 8
  • 7
  • Hope It will solve issue but please add explanation of your code with it so user will get perfect understanding which he/she really wants. – Jaimil Patel May 29 '20 at 14:27