Please help me in implementing the date picker in IOS .I try three things
1) Type ="Date " it is working fine but there is no done button.
2) I take date box there is of focus and fluctuation.
Now i thought to insert Native plugin of date picker in iOS(Latest).
Or provide some example of mobile scroll in IOS
Js code:
/**
* Cordova DatePicker Plugin
* Copyright (c) Greg Allen 2011
* MIT Licensed
*
* Updated for Cordova 2.1 by Robert (Jamie) Munro
*/
if (typeof cordova !== "undefined") {
/**
* Constructor
*/
function DatePicker() {
this._callback;
}
/**
* show - true to show the ad, false to hide the ad
*/
DatePicker.prototype.show = function(options, cb) {
var padDate = function(date) {
if (date.length == 1) {
return ("0" + date);
}
return date;
};
if (options.date) {
options.date = options.date.getFullYear() + "-" +
padDate(options.date.getMonth()+1) + "-" +
padDate(options.date.getDate()) +
"T" + padDate(options.date.getHours()) + ":" +
padDate(options.date.getMinutes()) + ":00Z";
}
var defaults = {
mode : 'datetime',
date : '',
allowOldDates : true,
allowFutureDates : true
};
for (var key in defaults) {
if (typeof options[key] !== "undefined")
defaults[key] = options[key];
}
this._callback = cb;
cordova.exec("DatePicker.show", defaults);
};
DatePicker.prototype._dateSelected = function(date) {
var d = new Date(parseFloat(date) * 1000);
if (this._callback)
this._callback(d);
}
cordova.addConstructor(function() {
if (!window.plugins) {
window.plugins = {};
}
window.plugins.datePicker = new DatePicker();
});
};
datepicker.m code:
// Phonegap DatePicker Plugin
// Copyright (c) Greg Allen 2011
// MIT Licensed
//
// Additional refactoring by Sam de Freyssinet
#import "DatePicker.h"
#interface DatePicker (Private)
// Initialize the UIActionSheet with ID <UIActionSheetDelegate> delegate UIDatePicker datePicker (UISegmentedControl)closeButton
- (void)initActionSheet:(id <UIActionSheetDelegate>)delegateOrNil datePicker:(UIDatePicker *)datePicker closeButton:(UISegmentedControl *)closeButton;
// Creates the NSDateFormatter with NSString format and NSTimeZone timezone
- (NSDateFormatter *)createISODateFormatter:(NSString *)format timezone:(NSTimeZone *)timezone;
// Creates the UIDatePicker with NSMutableDictionary options
- (UIDatePicker *)createDatePicker:(CGRect)pickerFrame;
// Creates the UISegmentedControl with UIView parentView, NSString title, ID target and SEL action
- (UISegmentedControl *)createActionSheetCloseButton:(NSString *)title target:(id)target action:(SEL)action;
// Configures the UIDatePicker with the NSMutableDictionary options
- (void)configureDatePicker:(NSMutableDictionary *)optionsOrNil;
#end
#implementation DatePicker
#synthesize datePickerSheet = _datePickerSheet;
#synthesize datePicker = _datePicker;
#synthesize isoDateFormatter = _isoDateFormatter;
#pragma mark - Public Methods
- (CDVPlugin *)initWithWebView:(UIWebView *)theWebView
{
self = (DatePicker *)[super initWithWebView:theWebView];
if (self)
{
UIDatePicker *userDatePicker = [self createDatePicker:CGRectMake(0, 40, 0, 0)];
UISegmentedControl *datePickerCloseButton = [self createActionSheetCloseButton:#"Close" target:self action:#selector(dismissActionSheet:)];
NSDateFormatter *isoTimeFormatter = [self createISODateFormatter:k_DATEPICKER_DATETIME_FORMAT timezone:[NSTimeZone defaultTimeZone]];
self.datePicker = userDatePicker;
self.isoDateFormatter = isoTimeFormatter;
userDatePicker.datePickerMode=UIDatePickerModeCountDownTimer;
[self initActionSheet:self datePicker:userDatePicker closeButton:datePickerCloseButton];
}
return self;
}
- (void)show:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options
{
if (isVisible) {
return;
}
[self configureDatePicker:options];
[self.datePickerSheet showInView:[[super webView] superview]];
[self.datePickerSheet setBounds:CGRectMake(0, 0, 320, 485)];
isVisible = YES;
}
- (void)dismissActionSheet:(id)sender {
[self.datePickerSheet dismissWithClickedButtonIndex:0 animated:YES];
}
- (void)onMemoryWarning
{
// It could be better to close the datepicker before the system
// clears memory. But in reality, other non-visible plugins should
// be tidying themselves at this point. This could cause a fatal
// at runtime.
if (isVisible) {
return;
}
[self release];
}
- (void)dealloc
{
[_datePicker release];
[_datePickerSheet release];
[_isoDateFormatter release];
[super dealloc];
}
#pragma mark - UIActionSheetDelegate methods
- (void)actionSheet:(UIActionSheet *)actionSheet willDismissWithButtonIndex:(NSInteger)buttonIndex
{
NSString* jsCallback = [NSString stringWithFormat:#"window.plugins.datePicker._dateSelected(\"%i\");", (int)[self.datePicker.date timeIntervalSince1970]];
[super writeJavascript:jsCallback];
}
- (void)actionSheet:(UIActionSheet *)actionSheet didDismissWithButtonIndex:(NSInteger)buttonIndex
{
isVisible = NO;
}
#pragma mark - Private Methods
- (void)initActionSheet:(id <UIActionSheetDelegate>)delegateOrNil datePicker:(UIDatePicker *)datePicker closeButton:(UISegmentedControl *)closeButton
{
UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle:nil
delegate:delegateOrNil
cancelButtonTitle:nil
destructiveButtonTitle:nil
otherButtonTitles:nil];
[actionSheet setActionSheetStyle:UIActionSheetStyleBlackTranslucent];
[actionSheet addSubview:datePicker];
[actionSheet addSubview:closeButton];
self.datePickerSheet = actionSheet;
[actionSheet release];
}
- (UIDatePicker *)createDatePicker:(CGRect)pickerFrame
{
UIDatePicker *datePickerControl = [[UIDatePicker alloc] initWithFrame:pickerFrame];
datePickerControl.datePickerMode=UIDatePickerModeCountDownTimer;
return [datePickerControl autorelease];
}
- (NSDateFormatter *)createISODateFormatter:(NSString *)format timezone:(NSTimeZone *)timezone;
{
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setTimeZone:timezone];
[dateFormatter setDateFormat:format];
return [dateFormatter autorelease];
}
- (UISegmentedControl *)createActionSheetCloseButton:(NSString *)title target:(id)target action:(SEL)action
{
UISegmentedControl *closeButton = [[UISegmentedControl alloc] initWithItems:[NSArray arrayWithObject:title]];
closeButton.momentary = YES;
closeButton.frame = CGRectMake(260, 7.0f, 50.0f, 30.0f);
closeButton.segmentedControlStyle = UISegmentedControlStyleBar;
closeButton.tintColor = [UIColor blackColor];
[closeButton addTarget:target action:action forControlEvents:UIControlEventValueChanged];
return [closeButton autorelease];
}
- (void)configureDatePicker:(NSMutableDictionary *)optionsOrNil;
{
NSString *mode = [optionsOrNil objectForKey:#"mode"];
NSString *dateString = [optionsOrNil objectForKey:#"date"];
BOOL allowOldDates = NO;
BOOL allowFutureDates = YES;
if ([[optionsOrNil objectForKey:#"allowOldDates"] intValue] == 1) {
allowOldDates = YES;
}
if ( ! allowOldDates) {
self.datePicker.minimumDate = [NSDate date];
}
if ([[optionsOrNil objectForKey:#"allowFutureDates"] intValue] == 0) {
allowFutureDates = NO;
}
if ( ! allowFutureDates) {
self.datePicker.maximumDate = [NSDate date];
}
self.datePicker.date = [self.isoDateFormatter dateFromString:dateString];
if ([mode isEqualToString:#"date"]) {
self.datePicker.datePickerMode = UIDatePickerModeDate;
}
else if ([mode isEqualToString:#"time"])
{
self.datePicker.datePickerMode = UIDatePickerModeCountDownTimer;
}
else
{
self.datePicker.datePickerMode = UIDatePickerModeDateAndTime;
}
}
#end
Datepicker.h code:
// Phonegap DatePicker Plugin
// Copyright (c) Greg Allen 2011
// MIT Licensed
#import <Foundation/Foundation.h>
#import <Cordova/CDVPlugin.h>
#ifndef k_DATEPICKER_DATETIME_FORMAT
#define k_DATEPICKER_DATETIME_FORMAT #"yyyy-MM-dd'T'HH:mm:ss'Z'"
#endif
#interface DatePicker : CDVPlugin <UIActionSheetDelegate> {
UIActionSheet *_datePickerSheet;
UIDatePicker *_datePicker;
NSDateFormatter *_isoDateFormatter;
BOOL isVisible;
}
#property (nonatomic, retain) UIActionSheet* datePickerSheet;
#property (nonatomic, retain) UIDatePicker* datePicker;
#property (nonatomic, retain) NSDateFormatter* isoDateFormatter;
//- (void) prepare:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options;
- (void) show:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options;
#end
If you want native date picker use plug in:
https://github.com/phonegap/phonegap-plugins/tree/master/iPhone/DatePicker
else use normal jquerymobile datebox:
http://dev.jtsage.com/jQM-DateBox2/
Related
Hi everyone iam new in objective c, now i try to create the app like "What's the word". I find this tutorial and lerned it as well as i can. But i have some problems. I want when i click on buttons the currentTitle replace the lable in placesView. Button click method in LettersView.m named as "displayChar". I have success in getting currentTitle but now i don't know how to pass it to GameController and paste text on "places".
I will be grateful for any help!
Here is my code
LettersView.h
#import <UIKit/UIKit.h>
#class LettersView;
#protocol LetterClickDelegateProtocol <NSObject>
-(void)letterView:(LettersView*)letterView addChar:(NSString *)addChar;
#end
#interface LettersView : UIImageView
#property (strong, nonatomic, readonly) NSString* letter;
#property (assign, nonatomic) BOOL isMatched;
#property (strong, nonatomic) NSString *clickLetter;
#property (weak, nonatomic) id<LetterClickDelegateProtocol> clickDelegate;
#property (strong, nonatomic) UIButton *lblChar;
-(instancetype)initWithLetter:(NSString*)letter andSideLength:(float)sideLength;
#end
LettersView.m
#import "LettersView.h"
#import "config.h"
#implementation LettersView{
NSInteger _xOffset, _yOffset;
}
- (id)initWithFrame:(CGRect)frame
{
NSAssert(NO, #"Use initWithLetter:andSideLength instead");
return nil;
}
-(instancetype)initWithLetter:(NSString*)letter andSideLength:(float)sideLength
{
//the letter background
UIImage* img = [UIImage imageNamed:#"btn_letter#2x.png"];
//create a new object
self = [super initWithImage:img];
if (self != nil) {
//resize the letters
float scale = sideLength/img.size.width;
self.frame = CGRectMake(0,0,img.size.width*scale, img.size.height*scale);
UIButton *lblChar = [[UIButton alloc] initWithFrame:self.bounds];
lblChar.tintColor = [UIColor blackColor];
lblChar.backgroundColor = [UIColor clearColor];
[lblChar setTitle:letter forState:UIControlStateNormal];
[lblChar addTarget:self action:#selector(displaychar:)forControlEvents:UIControlEventTouchUpInside];
[self addSubview:lblChar];
self.isMatched = NO;
_letter = letter;
self.userInteractionEnabled = YES;
}
return self;
}
-(void)displayChar:(id)sender {
UIButton *lblChar = (UIButton *)sender;
NSLog(#" The button's title is %#.", lblChar.currentTitle);
_clickLetter = lblChar.currentTitle;
if (self.clickDelegate) {
[self.clickDelegate letterView:self addChar:lblChar.currentTitle];
}
NSLog(#"hu %#", _clickLetter);
}
PlacesView.h
// PlacesView.m
#import "PlacesView.h"
#import "config.h"
#implementation PlacesView
-(id)initWithFrame:(CGRect)frame {
NSAssert(NO, #"Use initwithletter");
return nil;
}
-(instancetype)initWithLetter:(NSString *)letter andSideLength:(float)sideLength
{
UIImage *img = [UIImage imageNamed:#"btn_input#2x.png"];
self = [super initWithImage: img];
if (self != nil) {
self.isMatched = NO;
float scale = sideLength/img.size.width;
self.frame = CGRectMake(0, 0, img.size.width*scale, img.size.height*scale);
//bullshit time
_fieldForLetter = [[UILabel alloc] initWithFrame:self.bounds];
_fieldForLetter.textAlignment = NSTextAlignmentCenter;
_fieldForLetter.textColor = [UIColor blackColor];
_fieldForLetter.backgroundColor = [UIColor clearColor];
_fieldForLetter.text = #"*"; // if button pressed button title placed here.
[self addSubview:_fieldForLetter];
_letter = letter;
}
return self;
}
#end
GameController.m
#import "GameController.h"
#import "config.h"
#import "LettersView.h"
#import "PlacesView.h"
#import "AppDelegate.h"
#implementation GameController {
//tile lists
NSMutableArray* _letters;
NSMutableArray* _places;
}
-(instancetype)init {
self = [super init];
if (self != nil) {
self.points = [[PointsController alloc] init];
self.audioController = [[AudioController alloc] init];
[self.audioController preloadAudioEffects: kAudioEffectFiles];
}
return self;
}
-(void)dealRandomWord {
NSAssert(self.level.words, #"Level not loaded");
// random word from plist
NSInteger randomIndex = arc4random()%[self.level.words count];
NSArray* anaPair = self.level.words[ randomIndex ];
NSString* word1 = anaPair[1]; // answer
NSString* word2 = anaPair[2]; // some letters
_helpstr = anaPair[3]; // helper
NSLog(#"qweqweq %# %#" , word1 , word2);
NSInteger word1len = [word1 length];
NSInteger word2len = [word2 length];
NSLog(#"phrase1[%li]: %#", (long)word1len, word1);
NSLog(#"phrase2[%li]: %#", (long)word2len, word2);
//calculate the letter size
float letterSide = ceilf( kScreenWidth*0.9 / (float)MAX(word1len, word2len) ) - kTileMargin;
//get the left margin for first letter
float xOffset = (kScreenWidth - MAX(word1len, word2len) * (letterSide + kTileMargin))/2;
//adjust for letter center
xOffset += letterSide/2;
float yOffset = 1.5* letterSide;
// init places list
_places = [NSMutableArray arrayWithCapacity: word1len];
// create places
for (NSInteger i = 0; i<word1len; i++){
NSString *letter = [word1 substringWithRange:NSMakeRange(i, 1)];
if (![letter isEqualToString:#" "]) {
PlacesView* place = [[PlacesView alloc] initWithLetter:letter andSideLength:letterSide];
place.center = CGPointMake(xOffset + i*(letterSide + kTileMargin), kScreenHeight/4);
[self.gameView addSubview:place];
[_places addObject: place];
}
}
//init letters list
_letters = [NSMutableArray arrayWithCapacity: word2len];
//create letter
for (NSInteger i=0;i<word2len;i++) {
NSString* letter = [word2 substringWithRange:NSMakeRange(i, 1)];
if (![letter isEqualToString:#" "]) {
LettersView* letv = [[LettersView alloc] initWithLetter:letter andSideLength:letterSide];
letv.center = CGPointMake(xOffset + i * (letterSide + kTileMargin), kScreenHeight); // "/3*4"
if (i > 6) {
letv.center = CGPointMake(-5.15 * xOffset + i * (letterSide + kTileMargin), kScreenHeight + yOffset); // "/3*4"
}
letv.clickDelegate = self;
[self.gameView addSubview:letv];
[_letters addObject: letter];
}
}
}
-(void)letterView:(LettersView *)letterView addChar:(NSString *)addChar
{
PlacesView* placesView = nil;
for (PlacesView* pl in _places) {
//if (CGRectContainsPoint(pl.frame, pt)) {
if () {
//placesView = pl;
placesView.fieldForLetter.text = letterView.lblChar.currentTitle;
break;
}
}
//1 check if target was found
if (placesView!=nil) {
//2 check if letter matches
if ([placesView.letter isEqualToString: letterView.letter]) {
[self placeLetter:letterView atTarget:placesView];
[self.audioController playEffect: kSoundLetterTap];
self.points.points += self.level.coinsPerLvl; //ne nado tak
NSLog(#"Current points %d" , self.points.points);
[self checkForSuccess];
} else {
[self.audioController playEffect:kSoundFail];
[self addAlert:#"ne success" andMessage:#"You lose!" andButton:#"eshe cyka"];
}
}
}
-(void)placeLetter:(LettersView*)letterView atTarget:(PlacesView*)placeView {
placeView.isMatched = YES;
letterView.isMatched = YES;
letterView.userInteractionEnabled = NO;
}
-(void)checkForSuccess {
for (PlacesView* p in _places) {
//no success, bail out
if (p.isMatched==NO) return;
}
NSLog(#"ya!");
[self addAlert:#"Success" andMessage:#"You win!" andButton:#"eshe cyka"];
[self.audioController playEffect:kSoundSuccess];
}
-(void)addAlert: (NSString *)addTitle andMessage: (NSString *)alertMessage andButton: (NSString *)alertButton {
dispatch_async(dispatch_get_main_queue(), ^{
UIWindow* window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
window.rootViewController = [UIViewController new];
window.windowLevel = UIWindowLevelAlert + 1;
UIAlertController *alert = [UIAlertController alertControllerWithTitle: addTitle message:alertMessage preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction *defaultAction= [UIAlertAction actionWithTitle:alertButton style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
window.hidden = YES;
}];
[alert addAction:defaultAction];
[window makeKeyAndVisible];
[window.rootViewController presentViewController:alert animated:YES completion:nil];
});
}
#end
Your GameController needs to keep a reference to PlacesView. It can also assign the action into LettersView so when the button in LettersView is pressed, the GameController will fetch it and perform an action in PlacesView. GameController is what both the other classes have in common, so it can handle any actions between them.
Another option is to use NSNotificationCenter and post a message in LettersView when the button is pressed, and listen for it in PlacesView.
Yet anther way is using a delegates where GameController makes sure that PlacesView is set as the delegate. When LettersView's button is pressed, it will call the delegate method which PlacesView listens to.
I'd go with first option.
Hey I was wondering is their any possible way I can link two actions to the same button in Xcode? I've already tried but keep getting this error: "terminating with uncaught exception of type NSException". So i'm guessing I am not able to do that? See what i'm trying to do is
make a button play a sound but that same button is also linked to starting a new round in the game. How would I go about doing this? I've currently got this going in my .m file.
#import "BullsEyeViewController.h"
#interface BullsEyeViewController ()
#end
#implementation BullsEyeViewController
{
int _currentValue;
int _targetValue;
int _score;
int _round;
}
- (IBAction)playSound:(id)sender {
SystemSoundID soundID;
NSString *buttonName=[sender currentTitle];
NSString *soundFile=[[NSBundle mainBundle]
pathForResource:buttonName ofType:#"mp3"];
AudioServicesCreateSystemSoundID((__bridge CFURLRef)
[NSURL fileURLWithPath:soundFile], &
soundID);
AudioServicesPlaySystemSound(soundID);
}
- (void)viewDidLoad
{
[super viewDidLoad];
[self startNewGame];
[self updateLabels];
UIImage *thumbImageNormal = [UIImage
imageNamed:#"SliderThumb-Normal"];
[self.slider setThumbImage:thumbImageNormal
forState:UIControlStateNormal];
UIImage *thumbImageHighlighted = [UIImage
imageNamed:#"SliderThumb-Highlighted"];
[self.slider setThumbImage:thumbImageHighlighted
forState:UIControlStateHighlighted];
UIImage *trackLeftImage =
[[UIImage imageNamed:#"SliderTrackLeft"]
resizableImageWithCapInsets:UIEdgeInsetsMake(0, 14, 0, 14)];
[self.slider setMinimumTrackImage:trackLeftImage
forState:UIControlStateNormal];
UIImage *trackRightImage =
[[UIImage imageNamed:#"SliderTrackRight"]
resizableImageWithCapInsets:UIEdgeInsetsMake(0, 14, 0, 14)];
[self.slider setMaximumTrackImage:trackRightImage
forState:UIControlStateNormal];
// Do any additional setup after loading the view, typically from a nib.
}
- (void)startNewRound
{
_round += 1;
_targetValue = 1 + arc4random_uniform(100);
_currentValue = 50;
self.slider.value = _currentValue;
}
- (void)startNewGame
{
_score = 0;
_round = 0;
[self startNewRound];
}
- (void)updateLabels
{
self.targetLabel.text = [NSString stringWithFormat:#"%d",
_targetValue];
self.scoreLabel.text = [NSString stringWithFormat:#"%d",
_score];
self.roundLabel.text = [NSString stringWithFormat:#"%d",
_round];
}
- (BOOL)prefersStatusBarHidden
{
return YES;
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
- (IBAction)showAlert
{
int difference = abs(_targetValue - _currentValue);
int points = 100 - difference;
NSString *title;
if (difference == 0) {
title = #"Perfect!";
points += 100;
} else if (difference < 5) {
title = #"You almost had it!";
if (difference == 1) {
points += 50;
}
} else if (difference < 10 ) {
title = #"Pretty good!";
} else {
title = #"Not even close...";
}
_score+=points;
NSString *message = [NSString stringWithFormat:#"You scored %d points", points];
UIAlertView *alertView = [[UIAlertView alloc]
initWithTitle: title
message:message
delegate:self
cancelButtonTitle:#"OK"
otherButtonTitles: nil];
[alertView show];
}
-(IBAction)sliderMoved:(UISlider *)slider
{
_currentValue = lroundf(slider.value);
}
- (void)alertView:(UIAlertView *)alertView
didDismissWithButtonIndex:(NSInteger)buttonIndex
{
[self startNewRound];
[self updateLabels];
}
-(IBAction)startOver
{
CATransition *transition = [CATransition animation];
transition.type = kCATransitionFade;
transition.duration = 1;
transition.timingFunction = [CAMediaTimingFunction
functionWithName:kCAMediaTimingFunctionEaseOut];
[self startNewGame];
[self updateLabels];
[self.view.layer addAnimation:transition forKey:nil];
}
#end
And here's my .h file.
//
// BullsEyeViewController.h
// BullsEye
//
// Created by Sebastian Shelley on 28/04/2014.
// Copyright (c) 2014 Sebastian Shelley. All rights reserved.
//
#import <UIKit/UIKit.h>
#import <AudioToolbox/AudioToolbox.h>
#interface BullsEyeViewController : UIViewController
<UIAlertViewDelegate>
#property (nonatomic, weak) IBOutlet UISlider *slider;
#property (nonatomic, weak) IBOutlet UILabel *targetLabel;
#property (nonatomic, weak) IBOutlet UILabel *scoreLabel;
#property (nonatomic, weak) IBOutlet UILabel *roundLabel;
-(IBAction)showAlert;
-(IBAction)sliderMoved:(UISlider *)slider;
-(IBAction)startOver;
- (IBAction)playSound:(id)sender;
#end
Some help would be greatly appreciated :)
Add an action like this to the button
-(IBAction)myButtonPressed:(id)sender
{
[self playSound:sender];
[self startNewRound:Sender];
}
Use only one action, just set a BOOL to check if you need to play the sound or not.
Example code would be:
-(IBAiction)btnPressed:(id)sender
{
if(playsound)
{
[self playSound];
playsound = NO;
}
[self startOver];
}
And then whenever you want the saund to be played again just set playsound to YES and next time user presses the button it will play the sound again
I am putting a twitter feed in my app and no matter what I have tried to do to get the tweets to display in their entirety, I have not been entirely successful. Most tweets show up fine but it's the really long ones that have given me a headache. I thought it was because I was somehow not getting enough lines in my textLabel, but I noticed that if a user has elongated their tweet by hitting enter multiple times the tweets would show up fine. Which leads me to believe somehow it is truncating after a certain amount of characters. I don't know if I'm doing something wrong or if this is just an issue with twitter. If anyone can see anything in my code that is wrong, or could be changed to fix this, please let me know. Thank you
#import "TwitterFeedTVC.h"
#import "TweetVC.h"
#import <QuartzCore/QuartzCore.h>
#import "GTMNSString+HTML.h"
#define REFRESH_HEADER_HEIGHT 52.0f
#define FONT_SIZE 14.0f
#define CELL_CONTENT_WIDTH 320.0f
#define CELL_CONTENT_MARGIN 10.0f
#implementation TwitterFeedTVC
#synthesize textPull, textRelease, textLoading, refreshHeaderView, refreshLabel, refreshArrow, refreshSpinner, twitterFeedName, twitterFeedTitle;
- (id)initWithStyle:(UITableViewStyle)style {
self = [super initWithStyle:style];
if (self != nil)
{
[self setupStrings];
}
return self;
}
- (id)initWithCoder:(NSCoder *)aDecoder
{
self = [super initWithCoder:aDecoder];
if (self != nil)
{
[self setupStrings];
}
return self;
}
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self != nil)
{
[self setupStrings];
}
return self;
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
}
#pragma mark - View lifecycle
- (void)viewDidLoad
{
[super viewDidLoad];
self.twitterFeedTitle.text = self.twitterFeedName;
self.navigationItem.title = self.twitterFeedName;
[self fetchTweets];
[self addPullToRefreshHeader];
}
- (void)fetchTweets
{
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:#"https://api.twitter.com/1/statuses/user_timeline.json?include_rts=true&screen_name=johnnelm9r&count=100"]];
if (data == nil)
{
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:#"Warning"
message:#"Twitter Is Not Responding. Please Try Again Later!"
delegate:self
cancelButtonTitle:#"Kali Baby"
otherButtonTitles: nil];
[alert show];
}
else
{
NSError *error;
tweets = [NSJSONSerialization JSONObjectWithData:data
options:kNilOptions
error:&error];
}
dispatch_async(dispatch_get_main_queue(), ^{
[self.tableView reloadData];
});
});
}
- (void)viewDidUnload
{
[super viewDidUnload];
textPull = nil;
textRelease = nil;
textLoading = nil;
refreshHeaderView = nil;
refreshLabel = nil;
refreshArrow = nil;
refreshSpinner = nil;
}
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
}
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
}
- (void)viewWillDisappear:(BOOL)animated
{
[super viewWillDisappear:animated];
}
- (void)viewDidDisappear:(BOOL)animated
{
[super viewDidDisappear:animated];
}
- (BOOL)shouldAutorotate
{
return YES;
}
- (NSUInteger)supportedInterfaceOrientations
{
return UIInterfaceOrientationMaskPortrait;
}
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
return (interfaceOrientation == UIInterfaceOrientationPortrait);
}
#pragma mark - Table view data source
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return tweets.count;
}
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath;
{
NSDictionary *tweet = [tweets objectAtIndex:indexPath.row];
NSString *text = [tweet objectForKey:#"text"];
CGSize constraint = CGSizeMake(CELL_CONTENT_WIDTH - (CELL_CONTENT_MARGIN * 2), CGFLOAT_MAX);
CGSize size = [text sizeWithFont:[UIFont systemFontOfSize:FONT_SIZE] constrainedToSize:constraint lineBreakMode:NSLineBreakByWordWrapping];
CGFloat height = MAX(size.height, 44.0f);
return height + ((CELL_CONTENT_MARGIN * 2) + 9);
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = #"TweetCell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil)
{
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
NSDictionary *tweet = [tweets objectAtIndex:indexPath.row];
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setFormatterBehavior:NSDateFormatterBehavior10_4];
[dateFormatter setTimeZone:[NSTimeZone timeZoneWithName:#"UTC"]];
[dateFormatter setDateFormat:#"EEE MMM dd HH:mm:ss +0000 yyyy"];
NSDate *currentDate = [dateFormatter dateFromString:[tweet objectForKey:#"created_at"]];
NSDate *todayDate = [NSDate date];
NSString *date = [dateFormatter stringFromDate:currentDate];
double timeInterval = [currentDate timeIntervalSinceDate:todayDate];
timeInterval = timeInterval * -1;
if (timeInterval < 1)
{
date = #"never";
}
else if (timeInterval <60)
{
date = #"less than a minute ago";
}
else if (timeInterval <3600)
{
int diff = round(timeInterval / 60);
date = [NSString stringWithFormat:#"%d minutes ago", diff];
}
else if (timeInterval < 86400)
{
int diff = round(timeInterval / 60 / 60);
date = [NSString stringWithFormat:#"%d hours ago", diff];
}
else if (timeInterval < 2629743)
{
int diff = round(timeInterval / 60 / 60 / 24);
date = [NSString stringWithFormat:#"%d days ago", diff];
}
else
{
date = #"never";
}
cell.textLabel.text = [[tweet objectForKey:#"text"] gtm_stringByUnescapingFromHTML];
cell.detailTextLabel.text = [NSString stringWithFormat:#"%#", date];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSString *imageUrl = [[tweet objectForKey:#"user"] objectForKey:#"profile_image_url"];
NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:imageUrl]];
dispatch_async(dispatch_get_main_queue(), ^{
cell.imageView.image = [UIImage imageWithData:data];
[cell addSubview:cell.imageView];
});
});
return cell;
}
- (void)setupStrings
{
textPull = #"Pull Down To Be Fresh...";
textRelease = #"Release To Be Fresh...";
textLoading = #"Getting Loaded...";
}
- (void)addPullToRefreshHeader
{
refreshHeaderView = [[UIView alloc] initWithFrame:CGRectMake(0, 0 - REFRESH_HEADER_HEIGHT, 320, REFRESH_HEADER_HEIGHT)];
refreshHeaderView.backgroundColor = [UIColor clearColor];
refreshLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 320, REFRESH_HEADER_HEIGHT)];
refreshLabel.backgroundColor = [UIColor clearColor];
refreshLabel.font = [UIFont boldSystemFontOfSize:12.0];
refreshLabel.textAlignment = UITextAlignmentCenter;
refreshArrow = [[UIImageView alloc] initWithImage:[UIImage imageNamed:#"KrizzOpener.png"]];
refreshArrow.frame = CGRectMake(floorf((REFRESH_HEADER_HEIGHT - 27) / 2),
(floorf(REFRESH_HEADER_HEIGHT - 44) / 2),
27, 44);
refreshSpinner = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
refreshSpinner.frame = CGRectMake(floorf(floorf(REFRESH_HEADER_HEIGHT - 20) / 2), floorf((REFRESH_HEADER_HEIGHT - 20) / 2), 20, 20);
refreshSpinner.hidesWhenStopped = YES;
[refreshHeaderView addSubview:refreshLabel];
[refreshHeaderView addSubview:refreshArrow];
[refreshHeaderView addSubview:refreshSpinner];
[self.tableView addSubview:refreshHeaderView];
}
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
if (isLoading) return;
isDragging = YES;
}
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
if (isLoading) {
if (scrollView.contentOffset.y > 0)
self.tableView.contentInset = UIEdgeInsetsZero;
else if (scrollView.contentOffset.y >= -REFRESH_HEADER_HEIGHT)
self.tableView.contentInset = UIEdgeInsetsMake(-scrollView.contentOffset.y, 0, 0, 0);
} else if (isDragging && scrollView.contentOffset.y < 0) {
[UIView beginAnimations:nil context:NULL];
if (scrollView.contentOffset.y < -REFRESH_HEADER_HEIGHT) {
refreshLabel.text = self.textRelease;
} else {
refreshLabel.text = self.textPull;
}
[UIView commitAnimations];
}
}
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
{
if (isLoading) return;
isDragging = NO;
if (scrollView.contentOffset.y <= -REFRESH_HEADER_HEIGHT)
{
[self startLoading];
}
}
- (void)startLoading {
isLoading = YES;
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:0.3];
self.tableView.contentInset = UIEdgeInsetsMake(REFRESH_HEADER_HEIGHT, 0, 0, 0);
refreshLabel.text = self.textLoading;
refreshArrow.hidden = YES;
[refreshSpinner startAnimating];
[UIView commitAnimations];
[self refresh];
}
- (void)stopLoading {
isLoading = NO;
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDelegate:self];
[UIView setAnimationDuration:0.3];
[UIView setAnimationDidStopSelector:#selector(stopLoadingComplete:finished:context:)];
self.tableView.contentInset = UIEdgeInsetsZero;
UIEdgeInsets tableContentInset = self.tableView.contentInset;
tableContentInset.top = 0.0;
self.tableView.contentInset = tableContentInset;
[UIView commitAnimations];
}
- (void)stopLoadingComplete:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context {
refreshLabel.text = self.textPull;
refreshArrow.hidden = NO;
[refreshSpinner stopAnimating];
}
- (void)refresh {
[self fetchTweets];
[self performSelector:#selector(stopLoading) withObject:nil afterDelay:2.7];
}
#pragma mark - Table view delegate
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([segue.identifier isEqualToString:#"tweetVC"])
{
NSInteger row = [[self tableView].indexPathForSelectedRow row];
NSDictionary *tweet = [tweets objectAtIndex:row];
TweetVC *tweetVC = segue.destinationViewController;
tweetVC.detailItem = tweet;
}
}
After a lot of investigation I found an article somewhere that said there is a difference between the text key and the retweeted_status.text key. The tweets being truncated were, in fact, retweets from the user using the text key. However, the retweeted_status.text key is only the tweet that was retweeted, without the user who originally tweeted it. That sucks because the retweeted_status.text key is NOT truncated. Ahhh, the joys of programming. Hopefully the new twitter API will address this. I hope this answer helps somebody.
Here is the link to what I found in case anyone is interested: http://code.google.com/p/twitter-api/issues/detail?id=2261
I haven't gone through your code, but I thought of mentioning this point that Twitter only allows tweet 140 characters long! This is the basic rule of a tweet. So no matter what you do tweet with mode than 140 characters will be truncated.
I hope this is not the issue?
Am getting confused here.I had implemented a calender control in ios application.But not able to find the position of a particular date when the user selects the date.How to find the position of a particular date which is selected by the user?Please some one help me or give me some advice.Provide any sample codes.Great answers would be appreciated.
In DayButton.h
//
// DayButton.h
// DDCalendarView
//
//
//
#import <UIKit/UIKit.h>
#protocol DayButtonDelegate <NSObject>
- (void)dayButtonPressed:(id)sender;
#end
#interface DayButton : UIButton {
id <DayButtonDelegate> delegate;
NSDate *buttonDate;
}
#property (nonatomic, assign) id <DayButtonDelegate> delegate;
#property (nonatomic, copy) NSDate *buttonDate;
- (id)buttonWithFrame:(CGRect)buttonFrame;
#end
In DayButton.m
//
// DayButton.m
// DDCalendarView
//
//
#import "DayButton.h"
#implementation DayButton
#synthesize delegate, buttonDate;
- (id)buttonWithFrame:(CGRect)buttonFrame {
self = [DayButton buttonWithType:UIButtonTypeCustom];
self.frame = buttonFrame;
self.titleLabel.textAlignment = UITextAlignmentRight;
self.backgroundColor = [UIColor clearColor];
[self setTitleColor:[UIColor grayColor] forState:UIControlStateNormal];
[self addTarget:delegate action:#selector(dayButtonPressed:) forControlEvents:UIControlEventTouchUpInside];
return self;
}
- (void)layoutSubviews {
[super layoutSubviews];
UILabel *titleLabel = [self titleLabel];
CGRect labelFrame = titleLabel.frame;
int framePadding = 4;
labelFrame.origin.x = self.bounds.size.width - labelFrame.size.width - framePadding;
labelFrame.origin.y = framePadding;
[self titleLabel].frame = labelFrame;
}
- (void)dealloc {
[super dealloc];
}
#end
In DDCalenderView.h
//
// DDCalendarView.h
// DDCalendarView
//
//
#import <UIKit/UIKit.h>
#import "DayButton.h"
#protocol DDCalendarViewDelegate <NSObject>
- (void)dayButtonPressed:(DayButton *)button;
#optional
- (void)prevButtonPressed;
- (void)nextButtonPressed;
#end
#interface DDCalendarView : UIView <DayButtonDelegate> {
id <DDCalendarViewDelegate> delegate;
NSString *calendarFontName;
UILabel *monthLabel;
NSMutableArray *dayButtons;
NSCalendar *calendar;
float calendarWidth;
float calendarHeight;
float cellWidth;
float cellHeight;
int currentMonth;
int currentYear;
}
#property(nonatomic, assign) id <DDCalendarViewDelegate> delegate;
- (id)initWithFrame:(CGRect)frame fontName:(NSString *)fontName delegate:(id)theDelegate;
- (void)updateCalendarForMonth:(int)month forYear:(int)year;
- (void)drawDayButtons;
- (void)prevBtnPressed:(id)sender;
- (void)nextBtnPressed:(id)sender;
#end
In DDCalenderView.m
//
// DDCalendarView.m
// DDCalendarView
//
//
#import "DDCalendarView.h"
#implementation DDCalendarView
#synthesize delegate;
- (id)initWithFrame:(CGRect)frame fontName:(NSString *)fontName delegate:(id)theDelegate {
if ((self = [super initWithFrame:frame])) {
self.delegate = theDelegate;
//Initialise vars
calendarFontName = fontName;
calendarWidth = frame.size.width;
calendarHeight = frame.size.height;
cellWidth = frame.size.width / 7.0f;
cellHeight = frame.size.height / 14.0f;
//View properties
// UIColor *bgPatternImage = [[UIColor alloc] initWithPatternImage:[UIImage imageNamed:#"square-paper.png"]];
//
// self.backgroundColor = bgPatternImage;
// [bgPatternImage release];
//Set up the calendar header
self.backgroundColor=[UIColor whiteColor];
UIButton *prevBtn = [UIButton buttonWithType:UIButtonTypeCustom];
[prevBtn setImage:[UIImage imageNamed:#"left-arrow.png"] forState:UIControlStateNormal];
prevBtn.frame = CGRectMake(0, 0, cellWidth, cellHeight);
[prevBtn addTarget:self action:#selector(prevBtnPressed:) forControlEvents:UIControlEventTouchUpInside];
UIButton *nextBtn = [UIButton buttonWithType:UIButtonTypeCustom];
[nextBtn setImage:[UIImage imageNamed:#"right-arrow.png"] forState:UIControlStateNormal];
nextBtn.frame = CGRectMake(calendarWidth - cellWidth, 0, cellWidth, cellHeight);
[nextBtn addTarget:self action:#selector(nextBtnPressed:) forControlEvents:UIControlEventTouchUpInside];
CGRect monthLabelFrame = CGRectMake(cellWidth, 0, calendarWidth - 2*cellWidth, cellHeight);
monthLabel = [[UILabel alloc] initWithFrame:monthLabelFrame];
monthLabel.font = [UIFont fontWithName:calendarFontName size:18];
monthLabel.textAlignment = UITextAlignmentCenter;
monthLabel.backgroundColor = [UIColor clearColor];
monthLabel.textColor = [UIColor blackColor];
//Add the calendar header to view
[self addSubview: prevBtn];
[self addSubview: nextBtn];
[self addSubview: monthLabel];
//Add the day labels to the view
char *days[7] = {"Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"};
for(int i = 0; i < 7; i++) {
CGRect dayLabelFrame = CGRectMake(i*cellWidth, cellHeight, cellWidth, cellHeight);
UILabel *dayLabel = [[UILabel alloc] initWithFrame:dayLabelFrame];
dayLabel.text = [NSString stringWithFormat:#"%s", days[i]];
dayLabel.textAlignment = UITextAlignmentCenter;
dayLabel.backgroundColor = [UIColor clearColor];
dayLabel.font = [UIFont fontWithName:calendarFontName size:16];
dayLabel.textColor = [UIColor darkGrayColor];
[self addSubview:dayLabel];
[dayLabel release];
}
[self drawDayButtons];
//Set the current month and year and update the calendar
calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSUInteger unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit;
NSDateComponents *dateParts = [calendar components:unitFlags fromDate:[NSDate date]];
currentMonth = [dateParts month];
currentYear = [dateParts year];
[self updateCalendarForMonth:currentMonth forYear:currentYear];
}
return self;
}
- (void)drawDayButtons {
dayButtons = [[NSMutableArray alloc] initWithCapacity:42];
for (int i = 0; i < 6; i++) {
for(int j = 0; j < 7; j++) {
CGRect buttonFrame = CGRectMake(j*cellWidth, (i+2)*cellHeight, cellWidth, cellHeight);
DayButton *dayButton = [[DayButton alloc] buttonWithFrame:buttonFrame];
dayButton.titleLabel.font = [UIFont fontWithName:calendarFontName size:14];
dayButton.delegate = self;
[dayButtons addObject:dayButton];
[dayButton release];
[self addSubview:[dayButtons lastObject]];
}
}
}
- (void)updateCalendarForMonth:(int)month forYear:(int)year {
char *months[12] = {"January", "February", "March", "April", "May", "June",
"July", "August", "September", "October", "November", "December"};
monthLabel.text = [NSString stringWithFormat:#"%s %d", months[month - 1], year];
//Get the first day of the month
NSDateComponents *dateParts = [[NSDateComponents alloc] init];
[dateParts setMonth:month];
[dateParts setYear:year];
[dateParts setDay:1];
NSDate *dateOnFirst = [calendar dateFromComponents:dateParts];
[dateParts release];
NSDateComponents *weekdayComponents = [calendar components:NSWeekdayCalendarUnit fromDate:dateOnFirst];
int weekdayOfFirst = [weekdayComponents weekday];
//Map first day of month to a week starting on Monday
//as the weekday component defaults to 1->Sun, 2->Mon...
if(weekdayOfFirst == 1) {
weekdayOfFirst = 7;
} else {
--weekdayOfFirst;
}
int numDaysInMonth = [calendar rangeOfUnit:NSDayCalendarUnit
inUnit:NSMonthCalendarUnit
forDate:dateOnFirst].length;
int day = 1;
for (int i = 0; i < 6; i++) {
for(int j = 0; j < 7; j++) {
int buttonNumber = i * 7 + j;
DayButton *button = [dayButtons objectAtIndex:buttonNumber];
button.enabled = NO; //Disable buttons by default
[button setTitle:nil forState:UIControlStateNormal]; //Set title label text to nil by default
[button setButtonDate:nil];
if(buttonNumber >= (weekdayOfFirst - 1) && day <= numDaysInMonth) {
[button setTitle:[NSString stringWithFormat:#"%d", day]
forState:UIControlStateNormal];
NSDateComponents *dateParts = [[NSDateComponents alloc] init];
[dateParts setMonth:month];
[dateParts setYear:year];
[dateParts setDay:day];
NSDate *buttonDate = [calendar dateFromComponents:dateParts];
[dateParts release];
[button setButtonDate:buttonDate];
button.enabled = YES;
++day;
}
}
}
}
- (void)prevBtnPressed:(id)sender {
if(currentMonth == 1) {
currentMonth = 12;
--currentYear;
} else {
--currentMonth;
}
[self updateCalendarForMonth:currentMonth forYear:currentYear];
if ([self.delegate respondsToSelector:#selector(prevButtonPressed)]) {
[self.delegate prevButtonPressed];
}
}
- (void)nextBtnPressed:(id)sender {
if(currentMonth == 12) {
currentMonth = 1;
++currentYear;
} else {
++currentMonth;
}
[self updateCalendarForMonth:currentMonth forYear:currentYear];
if ([self.delegate respondsToSelector:#selector(nextButtonPressed)]) {
[self.delegate nextButtonPressed];
}
}
- (void)dayButtonPressed:(id)sender {
DayButton *dayButton = (DayButton *) sender;
[self.delegate dayButtonPressed:dayButton];
}
- (void)dealloc {
[calendar release];
[dayButtons release];
[super dealloc];
}
#end
In MainViewController.h
//
// MainViewController.h
// DDCalendarView
//
//
#import <UIKit/UIKit.h>
#import "DDCalendarView.h"
#interface MainViewController : UIViewController <DDCalendarViewDelegate> {
DDCalendarView *calendarView;
}
#end
In MainVIewController.m
//
// MainViewController.m
// DDCalendarView
//
//
#import "MainViewController.h"
#implementation MainViewController
// Implement loadView to create a view hierarchy programmatically, without using a nib.
- (void)loadView {
UIView *appView = [[UIView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]];
calendarView = [[DDCalendarView alloc] initWithFrame:appView.bounds fontName:#"AmericanTypewriter" delegate:self];
self.view = appView;
[appView release];
[self.view addSubview: calendarView];
}
- (void)dayButtonPressed:(DayButton *)button {
//For the sake of example, we obtain the date from the button object
//and display the string in an alert view
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setTimeStyle:NSDateFormatterNoStyle];
[dateFormatter setDateStyle:NSDateFormatterLongStyle];
NSString *theDate = [dateFormatter stringFromDate:button.buttonDate];
[dateFormatter release];
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setTimeStyle:NSDateFormatterNoStyle];
[dateFormatter setDateStyle:NSDateFormatterLongStyle];
NSString *theDate = [dateFormatter stringFromDate:button.buttonDate];
[dateFormatter release];
// UIAlertView *dateAlert = [[UIAlertView alloc]
// initWithTitle:#"Date Pressed"
// message:theDate
// delegate:self
// cancelButtonTitle:#"Ok"
// otherButtonTitles:nil];
// [dateAlert show];
// [dateAlert release];
//
timeEntry *time=[[timeEntry alloc]init];
[time setDate:theDate];
[self.navigationController pushViewController:time animated:YES];
[time release];
}
- (void)nextButtonPressed {
NSLog(#"Next...");
}
- (void)prevButtonPressed {
NSLog(#"Prev...");
}
/*
// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad {
[super viewDidLoad];
}
*/
/*
// Override to allow orientations other than the default portrait orientation.
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
// Return YES for supported orientations
return (interfaceOrientation == UIInterfaceOrientationPortrait);
}
*/
- (void)didReceiveMemoryWarning {
// Releases the view if it doesn't have a superview.
[super didReceiveMemoryWarning];
// Release any cached data, images, etc that aren't in use.
}
- (void)viewDidUnload {
[super viewDidUnload];
// Release any retained subviews of the main view.
// e.g. self.myOutlet = nil;
}
- (void)dealloc {
[super dealloc];
}
#end
I took an image above the calender.If the user selects the date,the image has to move to that date in horizontal or vertical position.Is Animation necessary?If yes,how to handle or otherwise can anyone help in their own manner.Please.Great answers would be appreciated.
Have you ever tried Tapku library?
Its preferable for custom calender controls. Hope this helps you.
I would recommend using Kal. I use it for a month view and it works great. It keeps track of the date even when you move to another view.
EDIT:
get the location of the tap check out this link
I having an app so i just added some event or remainder (football match,movie) in my app for some particular date and time.
And this add event i also want to display in iphone calendar.
thanks and regards.
Have you checked out EventKit?
You can use simple JTCalender for this
first oyu have to include JT Calender framework for the project
You have to create two views in your UIViewController:
The first view is JTCalendarMenuView and it represents the part with the months names. This view is optional.
The second view is JTHorizontalCalendarView or JTVerticalCalendarView, it represents the calendar itself.
Your UIViewController have to implement JTCalendarDelegate, all methods are optional.
in .h file
#import <UIKit/UIKit.h>
#import "CustomTableViewCell.h"
#import "JTCalendar/JTCalendar.h"
#interface CalendarViewController : UIViewController<UITableViewDataSource,UITableViewDelegate,JTCalendarDelegate>
#property (strong, nonatomic) JTCalendarMenuView *calendarMenuView;
#property (strong, nonatomic) JTHorizontalCalendarView *calendarContentView;
#property (strong, nonatomic) JTCalendarManager *calendarManager;
#property (weak, nonatomic) IBOutlet NSLayoutConstraint *calendarContentViewHeight;
#end
.m file
------------
#import "CalendarViewController.h"
#import "ApptWindowView.h"
#import "SVProgressHUD.h"
#interface CalendarViewController () < UITextFieldDelegate>{
NSMutableDictionary *dayDateDict;
NSMutableArray*jsonDate,*dateAr1,*dateAr2;
UITableView *appointTableView;
CGSize screenRect;
NSString *dateAfterString;
int fontSize,headerBtnfont,height;
NSDateFormatter *dateFormat1 ;
NSString*cmpDay;
int count;
NSString * clickedDate;
NSString *day ;
NSMutableDictionary *_eventsByDate;
NSDate *_todayDate;
NSDate *_minDate;
NSDate *_maxDate;
NSDate *_dateSelected;
UIActivityIndicatorView *activityIndicator;
int i;
}
#end
#implementation CalendarViewController
- (void)viewDidLoad
{
[super viewDidLoad];
i=0;
dayDateDict=[[NSMutableDictionary alloc]init];
dateAr1=[[NSMutableArray alloc]init];
dateAr2=[[NSMutableArray alloc]init];
screenRect=[[UIScreen mainScreen]bounds].size;
//Create header here
self.view.backgroundColor=[UIColor colorWithRed:(CGFloat)233/255 green:(CGFloat)239/255 blue:(CGFloat)239/255 alpha:1];
UIView * headerView =[[UIView alloc]initWithFrame:CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, 55)];
headerView.backgroundColor =[UIColor whiteColor];
[self.view addSubview:headerView];
UILabel * titleLable =[[UILabel alloc]initWithFrame:CGRectMake(60, 25, [UIScreen mainScreen].bounds.size.width-120, 25)];
titleLable.text =#"CHOOSE APPOINTMENT";
titleLable.textAlignment = NSTextAlignmentCenter;
titleLable.font =[UIFont systemFontOfSize:12];
[headerView addSubview:titleLable];
UIButton *backButton = [UIButton buttonWithType:UIButtonTypeCustom];
[backButton setImage:[UIImage imageNamed:#"back_btn.png"] forState:UIControlStateNormal];
[backButton setFrame:CGRectMake(15, 30, 45, 15)];
[backButton addTarget:self action:#selector(backAction) forControlEvents:UIControlEventTouchUpInside];
[headerView addSubview:backButton];
UIButton *nextButton = [UIButton buttonWithType:UIButtonTypeCustom];
[nextButton setImage:[UIImage imageNamed:#"next_btn.png"] forState:UIControlStateNormal];
[nextButton setFrame:CGRectMake([UIScreen mainScreen].bounds.size.width-60, 30, 45, 15)];
[nextButton addTarget:self action:#selector(continueAction) forControlEvents:UIControlEventTouchUpInside];
[headerView addSubview:nextButton];
[self activityAction];
dispatch_async(dispatch_get_global_queue(0, 0),^{
dispatch_async(dispatch_get_main_queue(),^{
// [self createUI];
[self fetchSchedule];
_calendarManager = [JTCalendarManager new];
_calendarManager.delegate = self;
[self createMinAndMaxDate];
_calendarContentView=[JTHorizontalCalendarView new];
_calendarContentView.frame = CGRectMake(20, 100,[UIScreen mainScreen].bounds.size.width-40 , [UIScreen mainScreen].bounds.size.width-40);
_calendarContentView.backgroundColor=[UIColor whiteColor];
[_calendarManager setContentView:_calendarContentView];
[self.view addSubview:_calendarContentView];
_calendarMenuView=[JTCalendarMenuView new];
_calendarMenuView.frame=CGRectMake(20, 55,[UIScreen mainScreen].bounds.size.width-40 ,50);
_calendarMenuView.backgroundColor=[UIColor clearColor];
[self.view addSubview:_calendarMenuView];
[_calendarManager setMenuView:_calendarMenuView];
[_calendarManager setDate:[NSDate date]];
[activityIndicator stopAnimating];
});
});
[self createUI];
}
-(void)continueAction{
ApptWindowView *apptWindow=[[ApptWindowView alloc]init];
[self.navigationController pushViewController:apptWindow animated:YES];
}
- (UIView<JTCalendarDay> *)calendarBuildDayView:(JTCalendarManager *)calendar
{
JTCalendarDayView *view = [JTCalendarDayView new];
view.textLabel.font = [UIFont fontWithName:#"Avenir-Light" size:13];
view.textLabel.textColor = [UIColor blackColor];
return view;
}
NSError *error; NSURLResponse * urlResponse;
NSURL * url =[NSURL URLWithString:fetchScheduleService];
NSMutableURLRequest * request =[[NSMutableURLRequest alloc]initWithURL:url cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:50];
NSString * body =[NSString stringWithFormat:#"departmentId=%d",[SingletonClass sharedSingleton].deptId ];
[request setHTTPMethod:#"POST"];
[request setHTTPBody:[body dataUsingEncoding:NSUTF8StringEncoding]];
[request setValue:#"application/x-www-form-urlencoded" forHTTPHeaderField:#"Content-Type"];
NSData * data =[NSURLConnection sendSynchronousRequest:request returningResponse:&urlResponse error:&error];
if (!data) {
[SVProgressHUD dismiss];
return;
}
id jsonResponse =[NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:&error];
NSLog(#"schedule jason---->%#",jsonResponse);
if ([[jsonResponse objectForKey:#"code"] isEqualToNumber:[NSNumber numberWithInt:200]]) {
jsonDate=[jsonResponse objectForKey:#"data"];
[self convertTimeStamp];
}
//dispatch_async(dispatch_get_main_queue(),^{
// [SVProgressHUD dismiss];
//[self createUI];
// });
// });
}
#pragma mark-Create UI/Table View
-(void)createUI{
appointTableView = [[UITableView alloc]init];
appointTableView.frame = CGRectMake(10, 100+screenRect.width-40+10, screenRect.width-20, screenRect.height-( 100+screenRect.width-40+10));
appointTableView.delegate = self;
appointTableView.dataSource = self;
appointTableView.backgroundColor =[UIColor clearColor];
appointTableView.showsVerticalScrollIndicator = NO;
appointTableView.separatorStyle = UITableViewCellSeparatorStyleNone;
[self.view addSubview:appointTableView];
}
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
return [[dayDateDict objectForKey:clickedDate] count];
}
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
CustomTableViewCell * cell =(CustomTableViewCell*) [tableView cellForRowAtIndexPath:indexPath];
if (!cell) {
cell = [[CustomTableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:#"calender"];
cell.backgroundColor = [UIColor clearColor];
}
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
cell.selectionStyle = UITableViewCellSelectionStyleNone;
[dateFormat1 setDateFormat:#"HH:mm"];
NSDate * aptTime =[dateFormat1 dateFromString:[[dayDateDict objectForKey:clickedDate]objectAtIndex:indexPath.row] ];
NSDate *dateAfter=[aptTime dateByAddingTimeInterval:(1800) ];
dateAfterString =[dateFormat1 stringFromDate:dateAfter];
NSString *dis=[NSString stringWithFormat:#"%#-%#",[[dayDateDict objectForKey:clickedDate]objectAtIndex:indexPath.row],dateAfterString];
cell.appointmentTime.text =dis;
return cell;
}
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
return 100;
}
return 60;
}
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
ApptWindowView *apptWindow=[[ApptWindowView alloc]init];
[self.navigationController pushViewController:apptWindow animated:YES];
NSLog(#"clicked date-->%#",[[dayDateDict objectForKey:clickedDate]objectAtIndex:indexPath.row]);
NSDate * aptTime =[dateFormat1 dateFromString:[[dayDateDict objectForKey:clickedDate]objectAtIndex:indexPath.row] ];
NSDate *dateAfter=[aptTime dateByAddingTimeInterval:(1800) ];
dateAfterString =[dateFormat1 stringFromDate:dateAfter];
NSString *dis=[NSString stringWithFormat:#"%# to %# on %#",[[dayDateDict objectForKey:clickedDate]objectAtIndex:indexPath.row],dateAfterString,day];
[[NSUserDefaults standardUserDefaults]setObject:dis forKey:#"appointmentTime"];
[[NSUserDefaults standardUserDefaults]synchronize];
}
#pragma mark-convert timeStamp to date
-(void)convertTimeStamp{
for( NSString*valueForDate in jsonDate){
NSTimeInterval timeSec=[valueForDate doubleValue];
NSDate *date = [NSDate dateWithTimeIntervalSince1970:timeSec];
NSLog(#"\ndate are-->%#",date);
[self separateDate:date];
}
}
#pragma mark-separate date and Time
-(void)separateDate:(NSDate*)date1{
dateFormat1 = [[NSDateFormatter alloc] init];
[dateFormat1 setDateFormat:#"HH:mm"];
NSString * resultTime =[dateFormat1 stringFromDate:date1];
NSLog(#"date is-->%#",resultTime);
[dateFormat1 setDateFormat:#"dd-MM-YYYY"];
NSString *resultDay=[dateFormat1 stringFromDate:date1];
NSLog(#"day is-->%#",resultDay);
if([cmpDay isEqual:resultDay] || cmpDay==nil){
if(count!=1){
[dateAr1 addObject:resultTime];
}
if(count==1){
[dateAr2 addObject:resultTime];
}
}
else{
count=1;
dateAr2=[[NSMutableArray alloc]init];
[dateAr2 addObject:resultTime];
}
cmpDay=resultDay;
if(count!=1){
[dayDateDict setObject:dateAr1 forKey:resultDay];
}
else{
[dayDateDict setObject:dateAr2 forKey:resultDay];
}
NSLog(#"dictionary--->%#",dayDateDict);
}
#pragma mark - Buttons callback
- (IBAction)didGoTodayTouch
{
[_calendarManager setDate:_todayDate];
}
- (IBAction)didChangeModeTouch
{
_calendarManager.settings.weekModeEnabled = !_calendarManager.settings.weekModeEnabled;
[_calendarManager reload];
CGFloat newHeight = 300;
if(_calendarManager.settings.weekModeEnabled){
newHeight = 85.;
}
self.calendarContentViewHeight.constant = newHeight;
[self.view layoutIfNeeded];
}
#pragma mark - CalendarManager delegate
// Exemple of implementation of prepareDayView method
// Used to customize the appearance of dayView
- (void)calendar:(JTCalendarManager *)calendar prepareDayView:(JTCalendarDayView *)dayView
{
// Today
if([_calendarManager.dateHelper date:[NSDate date] isTheSameDayThan:dayView.date]){
dayView.circleView.hidden = NO;
dayView.circleView.backgroundColor = [UIColor blueColor];
dayView.dotView.backgroundColor = [UIColor whiteColor];
dayView.textLabel.textColor = [UIColor whiteColor];
}
// Selected date
else if(_dateSelected && [_calendarManager.dateHelper date:_dateSelected isTheSameDayThan:dayView.date]){
dayView.circleView.hidden = NO;
dayView.circleView.backgroundColor = [UIColor redColor];
dayView.dotView.backgroundColor = [UIColor whiteColor];
dayView.textLabel.textColor = [UIColor whiteColor];
}
// Other month
else if(![_calendarManager.dateHelper date:_calendarContentView.date isTheSameMonthThan:dayView.date]){
dayView.circleView.hidden = YES;
dayView.dotView.backgroundColor = [UIColor redColor];
dayView.textLabel.textColor = [UIColor lightGrayColor];
}
// Another day of the current month
else{
dayView.circleView.hidden = YES;
dayView.dotView.backgroundColor = [UIColor redColor];
dayView.textLabel.textColor = [UIColor blackColor];
}
if([self haveEventForDay:dayView.date]){
dayView.dotView.hidden = NO;
}
else{
dayView.dotView.hidden = YES;
}
}
- (void)calendar:(JTCalendarManager *)calendar didTouchDayView:(JTCalendarDayView *)dayView
{
_dateSelected = dayView.date ;
NSLog(#"orginal Clicked day-->%#",dayView.date);
NSDateFormatter *dateFormat2 = [[NSDateFormatter alloc] init];
[dateFormat2 setDateFormat:#"dd-MM-YYYY"];
clickedDate =[dateFormat2 stringFromDate:_dateSelected];
NSLog(#"Selected date===>%#",clickedDate);
NSString* s= [dayDateDict objectForKey:clickedDate];
NSLog(#"time is===>%#",s);
[dateFormat2 setDateFormat:#"EEE, MMM dd "];
day =[dateFormat2 stringFromDate:_dateSelected];
NSLog(#"Selected day===>%#",day);
// Animation for the circleView
dayView.circleView.transform = CGAffineTransformScale(CGAffineTransformIdentity, 0.1, 0.1);
[UIView transitionWithView:dayView
duration:.3
options:0
animations:^{
dayView.circleView.transform = CGAffineTransformIdentity;
[_calendarManager reload];
} completion:nil];
// Load the previous or next page if touch a day from another month
if(![_calendarManager.dateHelper date:_calendarContentView.date isTheSameMonthThan:dayView.date]){
if([_calendarContentView.date compare:dayView.date] == NSOrderedAscending){
[_calendarContentView loadNextPageWithAnimation];
}
else{
[_calendarContentView loadPreviousPageWithAnimation];
}
}
[appointTableView reloadData];
}
#pragma mark - CalendarManager delegate - Page mangement
// Used to limit the date for the calendar, optional
- (BOOL)calendar:(JTCalendarManager *)calendar canDisplayPageWithDate:(NSDate *)date
{
return [_calendarManager.dateHelper date:date isEqualOrAfter:_minDate andEqualOrBefore:_maxDate];
}
- (void)calendarDidLoadNextPage:(JTCalendarManager *)calendar
{
// NSLog(#"Next page loaded");
}
- (void)calendarDidLoadPreviousPage:(JTCalendarManager *)calendar
{
// NSLog(#"Previous page loaded");
}
#pragma mark - Fake data
- (void)createMinAndMaxDate
{
_todayDate = [NSDate date];
// Min date will be 2 month before today
_minDate = [_calendarManager.dateHelper addToDate:_todayDate months:-3];
// Max date will be 2 month after today
_maxDate = [_calendarManager.dateHelper addToDate:_todayDate months:3];
}
- (BOOL)haveEventForDay:(NSDate *)date
{
if(i>=[dayDateDict allKeys].count){
i=0;
}
NSDateFormatter *dateFormatter;
dateFormatter = [[NSDateFormatter alloc]init];
[dateFormatter setDateFormat:#"dd-MM-YYYY"];
NSString *key = [dateFormatter stringFromDate:date];
while(i<[dayDateDict allKeys].count){
if([key isEqual:[[dayDateDict allKeys]objectAtIndex:i]]){
i++;
return YES;
}
else
return NO;
}
return NO;
}
#pragma mark-Activity Indicator
-(void)activityAction{
CGSize windowSize =[UIScreen mainScreen].bounds.size;
activityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
activityIndicator.frame = CGRectMake(windowSize.width/2-20, windowSize.height/2-55,40 ,40);
activityIndicator.color = [UIColor blackColor];
activityIndicator.alpha = 1;
[self.view addSubview:activityIndicator];
//[self placeSearchbaseId];
[activityIndicator startAnimating];
}
#end
I am fetching json data feching time form json as time stamp format and converting to local time
Then i am creating an events for it in the calender
You have third party apps like Kal which supports calendar integration. Check this link:
Kal Calendar
Hope it helps